带有变异向量的每个循环的C ++

时间:2016-10-25 22:19:28

标签: c++ foreach iterator

我刚才有一个关于C ++的快速问题。如果其他人已经问过这个问题,请告诉我,我会将其删除为副本。

我的问题基本上是,如果你在迭代时改变向量,那么每个循环的行为是什么。例如:

int main() {
    // your code goes here
    std::vector<char> v;
    for(char i = 'a'; i <= 'f'; i++) {
        v.push_back(i);
    }
    // v is {a, b, c, d, e, f}
    char c = 'A';
    for(const auto &elem : v) {
        cout << elem << ", ";
        v.push_back(c++);     // appending 'A', 'B', 'C', ...
    }
    cout << endl;
    // outputs: "a, b, c, , , ,"  (note there isn't a ... here, the loop stops).


    // Just printing normally now
    cout << "--------" << endl;
    for(const auto &elem : v) {
        cout << elem << ", ";
    }
    cout << endl;
    // outputs: a, b, c, d, e, f, A, B, C, D, E, F,
    return 0;
}

有人可以解释这种行为吗?我知道上面的每一个都等同于下面的代码,但似乎并没有让事情变得更清楚。

for (auto __begin = v.begin(), __end = v.end();
    __begin != __end; ++__begin) {
    auto elem =  *__begin;
    cout << elem << ", ";
    v.push_back(c++);           // appending 'A', 'B', 'C', ...
}
cout << endl;

更新

此问题似乎是由向量调整大小导致迭代器无效的。在创建向量后调用v.reserve(20)修复了此问题,并在二楼循环中输出:a, b, c, d, e, f,

1 个答案:

答案 0 :(得分:3)

std :: vector :: push_back状态的文档

如果new size()大于capacity(),则所有迭代器和引用(包括last-the-end迭代器)都将失效。否则只有过去的结束迭代器无效。

当for循环递增时,它将新的迭代器位置与v.end()进行比较,并可能进入UB,可能是某些段错误或异常。