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;
}
「迭代器指向不同的數據塊」是什麼意思? – jogojapan
爲什麼示例程序無效?什麼時候發生了你認爲無效的事情? – jogojapan
@jogojapan不同的向量,或添加新元素之前和之後相同向量的元素已導致重新分配。 – rwallace