std::vector
迭代器可以实现为指针。一个推论是,如果您向向量添加元素,未完成的迭代器显然会变得无效,因为通常必须重新分配向量数据。
关于确切规则的第一个猜测是允许的操作与指针的操作完全相同,例如在重新分配有效值之前不要取消引用无效的迭代器,但这似乎并不完全正确,因为微软的如果您减去指向不同数据块的向量迭代器(这肯定有助于调试),调试模式下的实现有时会抛出异常。
指针规则的附录是否类似于“不要将迭代器减去不同的数据块”或“在无效迭代器被重新分配有效值之前不要对它进行任何算术运算”或其他内容?
例如,以下程序(似乎适用于 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;
}