我想弄清楚是否允许在转换中更改向量。考虑代码:
std::vector<int> v;
for (int i = 0; i < 10; i++) v.push_back(i);
for (auto &i : v) std::cout << i << " ";
std::cout << std::endl;
std::transform(v.begin(), v.end(), std::back_inserter(v),
[](auto i) { return i;});
for (auto &i : v) std::cout << i << " ";
std::cout << std::endl;
我希望使用基于现有矢量内容的元素来扩展矢量。这是输出:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
但是如果我用 rbegin 替换开始和结束并相应地撕裂输出如下:
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 9 8 7 6 5 4 3 2 0 0
我在最后一个位置得到意外的 0 而不是 1。这让我怀疑这段代码本身是否是 UB,我也不应该依赖前向迭代器的正确输出。
for_each
上面没有。在某些情况下的某些更改是有效的,其他则不是。你的不是。通常迭代器失效会使迭代无效。从向量中添加或删除元素会使结束迭代器(以及插入/删除点或之后的所有迭代器)无效。重新分配使所有迭代器无效。
反向迭代器根据其基本迭代器的有效性遵循不同的规则。但前锋的情况已经是UB了。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句