为什么这个向量迭代器不会失效?

时间:2014-04-04 23:01:51

标签: c++ vector stl iterator invalidation

我已经阅读了一些有关迭代器失效的帖子,似乎需要向量重新分配的插入会使迭代器无效。也不应该在向量中间擦除导致失效?

我没有清楚地理解这一点,不确定为什么在从开始,中间和结束调整大小和擦除后使用这些迭代器并不会打破它们:

#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(int argc, char** argv) {

    vector<int> v;
    v.reserve(10);

    for (int i = 0; i < 10; i++)
        v.push_back(i);

    for (auto x = v.begin(); x != v.end(); x++) {
        cout << *x << endl;
    }

    cout << endl << "RESIZE" << endl << endl;

    for (int i = 10; i < 20; i++)
        v.push_back(i);

    for (auto x = v.begin(); x != v.end(); x++) {
        cout << *x << endl;
    }

    cout << endl << "RESIZE 2" << endl << endl;

    for (int i = 20; i < 200; i++)
        v.push_back(i);

    for (auto x = v.begin(); x != v.end(); x++) {
        cout << *x << endl;
    }

    cout << endl << "REMOVES" << endl << endl;

    v.erase(v.begin());
    v.pop_back();
    v.erase(v.begin() + 17);

    for (auto x = v.begin(); x != v.end(); x++) {
        cout << *x << endl;
    }

    return 0;
}

2 个答案:

答案 0 :(得分:4)

请注意,调用begin()或end()将始终提供理智的迭代器

但有点像:

std:vector<int> v;
....

std::vector<int>::iterator i=v.begin();
v.erase(i);
std::cout << *i << std::endl;  // i iterator was invalidated by erasing it
                               // trying to access it or increment it is undefined behaviour.
std::cout << *v.begin() << std::endl;  // begin() provides always a sane iterator.

答案 1 :(得分:2)

在你的代码中,总是在重用迭代器时,没有对向量进行干预修改,所以没有失效。

在调整大小和插入时,迭代器可能会失效。擦除仅使擦除元素处或之后的迭代器无效。

至少,这些是std::vector的释义规则。