Jon*_*Mee 5 c++ iterator for-loop insert set
所以我想将我后面所有元素的两倍插入set到set. 但显然我需要抓住结束迭代器,这样我就不会继续迭代新元素。(别担心,我检查过,set::insert不会使迭代器无效:http://www.cplusplus.com/reference/set/set/insert/#validity)所以给定输入,,set<int> foo = { 1, 2, 3 }这就是我所做的:
for(auto it = begin(foo), finish = end(foo); it != finish; ++it) {
foo.insert(*it * 2);
}
Run Code Online (Sandbox Code Playgroud)
我希望我的套装包含:
1, 2, 3, 4, 6
惊喜!它包含了:
-2147483648、-1073741824、1、2、3、4、6、8、12、16、24、32、48、64、96、128、192、256、384、512、768、1024、1536、2048、 3072、4096、6144、8192、12288、16384、24576、32768、49152、65536、98304、131072、196608、262144、393216、524288、786432、10 48576、1572864、2097152、3145728、4194304、6291456、8388608、12582912、 16777216、25165824、33554432、50331648、67108864、100663296、134217728、201326592、268435456、402653184、536870912、8053063 68、1073741824、1610612736
显然end(foo)并不像我想象的那样有效。那么...如果我想保存循环大小并计数呢?
我相信您的假设是 aset被分配到一个连续的容器中,并假设它最初有足够的空间,不需要重新分配连续的容器;在这种假设的情况下,我也希望看到你的行为。(但应该注意的是,即使在这是一个连续容器的情况下,也需要针对此假设验证容器的容量,以避免未定义的行为。)
但即使在您的问题中,您也指出这insert不会使迭代器无效,这意味着容器不能是连续的。据实set:
通常以二叉搜索树的形式实现
理解这一点,您实际上只是继续循环,直到迭代器结束指向最后一个叶节点。您的编译器set实现导致在插入元素时发生这种情况-2147483648,但这取决于实现,因此在另一个编译器上的行为可能有所不同。
您正在寻找一种已定义且独立于编译器的行为。根据您对设置内容的了解,您可以反向迭代set:
for(auto it = rbegin(foo); it != rend(foo); ++it) {
foo.insert(*it * 2);
}
Run Code Online (Sandbox Code Playgroud)
仅当插入创建的元素在迭代的元素之后排序时,这才是一个好的解决方案。例如,如果foo包含负数,这将不起作用。您可以通过检查来评估这一点:if(*cbegin(foo) < 0)在else- 块中,您可以执行上面建议的反向迭代循环,但否则您需要执行量子物理学家的答案中描述的临时集分配。