无效的向量迭代器

时间:2013-06-27 07:03:25

标签: c++ iterator std stdvector

std::vector迭代器可以实现为指针。一个必然结果是,如果向向量添加元素,未完成的迭代器显然会变得无效,因为通常必须重新分配向量数据。

关于确切规则的第一个猜测是允许的操作与指针的操作完全相同,例如在重新分配有效值之前不要取消引用无效迭代器,但这似乎并不完全正确,因为Microsoft在调试模式下的实现有时会抛出异常,例如:减去指向不同数据块的向量迭代器(这对于调试很有帮助)。

指针的附录是否规定“不要将迭代器减去不同的数据块”或“在无效的迭代器上做任何算术,直到它被重新赋值为有效值”或其他?

例如,以下程序(似乎适用于Microsoft C ++和GCC)是否有效?

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

using std::cout;
using std::ostream;
using std::vector;

template<class T> ostream& operator<<(ostream& os, vector<T>& v) {
    os << '[';
    bool c = 0;
    for (auto a: v) {
        if (c)
            os << ", ";
        c = 1;
        os << a;
    }
    return os << ']';
}

void f(vector<int>& v, vector<int>::iterator& i) {
    *i = 10;
    for (int j = 0; j < 10; j++)
        v.insert(begin(v), j);
    i = begin(v)+5;
}

int main() {
    vector<int> v;
    for (int i = 0; i < 10; i++)
        v.push_back(i);
    auto i = begin(v)+5;
    f(v, i);
    i[1] = 11;
    cout << v << '\n';
    return 0;
}

1 个答案:

答案 0 :(得分:-1)

你的例子无效,它的工作原理就是运气。可能导致向量中重新分配的每个操作都可能使所有迭代器无效。