Почему этот векторный итератор не становится недействительным?

Я прочитал несколько постов, касающихся аннулирования итераторов, и кажется, что вставки, которые требуют перераспределения векторов, сделали бы итераторы недействительными. Кроме того, не должны ли стирания в середине вектора вызывать недействительность?

У меня нет четкого понимания этого, я не уверен, почему использование этих итераторов после изменения размера и удаления из начала, середины и конца не нарушает их:

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

using namespace std;

int main(int argc, char** argv) {

vector<int> v;
v.reserve(10);

for (int i = 0; i < 10; i++)
v.push_back(i);

for (auto x = v.begin(); x != v.end(); x++) {
cout << *x << endl;
}

cout << endl << "RESIZE" << endl << endl;

for (int i = 10; i < 20; i++)
v.push_back(i);

for (auto x = v.begin(); x != v.end(); x++) {
cout << *x << endl;
}

cout << endl << "RESIZE 2" << endl << endl;

for (int i = 20; i < 200; i++)
v.push_back(i);

for (auto x = v.begin(); x != v.end(); x++) {
cout << *x << endl;
}

cout << endl << "REMOVES" << endl << endl;

v.erase(v.begin());
v.pop_back();
v.erase(v.begin() + 17);

for (auto x = v.begin(); x != v.end(); x++) {
cout << *x << endl;
}

return 0;
}

1

Решение

Обратите внимание, что вызов метода begin () или end () всегда обеспечивает нормальный итератор

Однако что-то вроде:

std:vector<int> v;
....

std::vector<int>::iterator i=v.begin();
v.erase(i);
std::cout << *i << std::endl;  // i iterator was invalidated by erasing it
// trying to access it or increment it is undefined behaviour.
std::cout << *v.begin() << std::endl;  // begin() provides always a sane iterator.
4

Другие решения

В вашем коде, всегда, когда итераторы используются повторно, не было никакой промежуточной модификации вектора, поэтому нет аннулирования.

Итераторы могут быть недействительными при изменении размера и вставке. Стирание делает недействительными только итераторы в или после стертого элемента.

По крайней мере, таковы перефразированные правила std::vector,

2

По вопросам рекламы [email protected]