Как заставить векторный итератор указывать на вектор после того, как vector.push_back () вызвал перераспределение? - PullRequest
2 голосов
/ 11 июня 2011

У меня есть функция void AddEntity(Entity* addtolist), которая выталкивает элементы обратно на vector, но поскольку размер и емкость равны, когда элемент добавляется к vector, вектор перераспределяется, и iterator становится недействительным.

Затем, когда я пытаюсь увеличить итератор, у меня происходит сбой из-за недопустимого итератора, поскольку push_back(...) не возвращает итератор в перераспределенную память, мне было интересно, как обойти эту проблему.

Должен ли я просто использовать insert(...), так как он возвращает iterator, или я должен использовать указатель, который сохраняет ссылку на вектор после его перераспределения, а затем iterator равен указателю, который указывает на перераспределенныйvector

Ответы [ 2 ]

6 голосов
/ 11 июня 2011
vector::push_back(const T& x);

Добавляет новый элемент в конце вектора, после его текущего последнего элемента.Содержимое этого нового элемента инициализируется копией x.

. Это фактически увеличивает вектор size на единицу, что вызывает перераспределение внутренней выделенной памяти, если размер вектора был равен емкости вектора.до звонка. Перераспределение делает недействительными все ранее полученные итераторы, ссылки и указатели.

Использование недействительного вектора приведет вас к сбоям или неопределенному поведению.новый итератор с использованием vector::begin().

vector<int> myvector;

vector<int>::iterator it;
it=myvector.begin()
0 голосов
/ 11 июня 2011

Как уже ответил @Als, push_back() может сделать недействительными все итераторы, если происходит перемещение.

В зависимости от решаемой проблемы, std::list может быть тем, что вам нужно.Добавление элемента в list не делает недействительными существующие итераторы в контейнере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...