我想知道是否允许更改变换内的向量。 考虑一下代码:
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替换begin和end并相应地rend输出如下:
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,我也不应该依赖正确的输出和前向迭代器。
答案 0 :(得分:0)
上面没有for_each
。某些情况下的某些变化是有效的,而其他情况则不然。你的不是。通常,迭代器失效会使迭代无效。在向量中添加或删除元素会使结束迭代器(以及插入/删除点处或之后的所有迭代器)无效。重新分配使所有迭代器无效。
反向迭代器遵循基于其基础迭代器的有效性的不同规则。但前瞻性案件已经是UB。