Почему при добавлении push_back() в vector предыдущий инициализированный итератор не указывает на тот же самый элемент? Разве vector не растет в сторону больших адресов?
Код (Text): #include <iostream> #include <vector> int main() { std::vector<int> v(99); v.push_back(0); for (int i=0; i<100; i++) { v[i] = i; } std::vector<int>::iterator iter = v.begin()+99; std::cout<<*iter<<std::endl; v.push_back(100); std::cout<<*iter<<std::endl; } Проверь, у меня указывает. ^) А вообще нет гарантии, что при вставке или удалении итератор останется валидным. В данном случае он остаётся валидным только потому, что если памяти при вставке элемента в контейнере не достаточно, то её резервируется в два раза больше чем было до этого. Не забывай, в векторе элементы всегда расположены последовательно, и если памяти для новых становиться недостаточно, то необходимо всё скопировать в другую область. Стоит убрать v.push_back(0); и всё.
Код (Text): vector <int> vect; std::vector<int>::iterator it; int result; int main() { vect.push_back(1); vect.push_back(2); vect.push_back(3); vect.push_back(4); vect.push_back(5); it = vect.begin(); it = it + 3; result = *it; vect.push_back(6); vect.push_back(7); vect.push_back(8); vect.push_back(9); result = *it; return 0; } При добавлении vect.push_back(9) итератор начинает указывать на ересь.
Вызывай reserve() перед началом заполнения вектора и не будет ре-аллокаций. Естественно, только до того как будет достигнут предел резервированного пространства.
KingT, тебе ж booster отписал - нельзя держать итератор после push_back(): http://www.cplusplus.com/reference/stl/vector/push_back.html Если тебе надо запомнить место, то делай так: Код (Text): uint32 offset = std::distance(v.begin(), i); v.push_back(...); i = v.begin() + offset;