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;
}
i
се нулира след вмъкването, като се използваbegin(v)
. Това е напълно валидно. - person jogojapan   schedule 27.06.2013i
. - person n. 1.8e9-where's-my-share m.   schedule 27.06.2013