在同一个向量上改变std :: transform里面的向量

时间:2017-03-01 00:35:41

标签: c++ c++11 vector stl

我想知道是否允许更改变换内的向量。 考虑一下代码:

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,我也不应该依赖正确的输出和前向迭代器。

1 个答案:

答案 0 :(得分:0)

上面没有for_each。某些情况下的某些变化是有效的,而其他情况则不然。你的不是。通常,迭代器失效会使迭代无效。在向量中添加或删除元素会使结束迭代器(以及插入/删除点处或之后的所有迭代器)无效。重新分配使所有迭代器无效。

反向迭代器遵循基于其基础迭代器的有效性的不同规则。但前瞻性案件已经是UB。