Делает ли std :: vector :: erase указателями недействительными?

Допустим, у меня есть std::vector<Node*> nodes; и std::vector<Unit*> units;, Каждый узел указывает на единицу, и каждая единица указывает обратно на узел, поэтому они связаны. Но что происходит, когда я использую стирать удалить элемент из середины любого массива? Если он изменяет размер массива, означает ли это, что он удаляет все элементы, сохраняет их в некотором буфере и создает обратно массив с измененным размером? Так что, если я использую стирание на узлах, указатели в единицах станут недействительными?

0

Решение

Удаление или вставка элементов из или в середину вектора перемещает все более высокие элементы вниз или вверх соответственно. Но так как вы просто перемещаете указатели, это почти тривиальная операция. Ничего не происходит с другими указателями (теми, которые вы не стираете), и ничего не происходит ни с одним из pointees.

2

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

Стирание элемента из вектора указателей не вызывает удаление объекта, на который указывает указатель. Ваш узел<-> Указатели юнитов остаются в силе.

2

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

Другие элементы будут сдвигаться вниз или вверх в памяти, когда вы используете стирание / вставка в середине вектора, и использование этих указателей теперь приведет к неопределенному поведению.

Если вы хотите сохранить эти указатели в силе, ваши варианты:

  1. После стирания переберите вектор, который вы только что использовали, и удалите указатели элементов на другой вектор.

  2. Используйте список. list.erase () не делает недействительными указатели / итераторы, за исключением элемента, который вы стираете, поэтому убедитесь, что вы удаляете указатель элемента, который вы стерли в другом векторе.

Недостаток списков заключается в том, что у них нет произвольного доступа, поэтому вам нужно будет выполнить итерацию, нет списка [] для вас.

Надеюсь это поможет.

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