Допустим, у меня есть std::vector<Node*> nodes;
и std::vector<Unit*> units;
, Каждый узел указывает на единицу, и каждая единица указывает обратно на узел, поэтому они связаны. Но что происходит, когда я использую стирать удалить элемент из середины любого массива? Если он изменяет размер массива, означает ли это, что он удаляет все элементы, сохраняет их в некотором буфере и создает обратно массив с измененным размером? Так что, если я использую стирание на узлах, указатели в единицах станут недействительными?
Удаление или вставка элементов из или в середину вектора перемещает все более высокие элементы вниз или вверх соответственно. Но так как вы просто перемещаете указатели, это почти тривиальная операция. Ничего не происходит с другими указателями (теми, которые вы не стираете), и ничего не происходит ни с одним из pointees.
Стирание элемента из вектора указателей не вызывает удаление объекта, на который указывает указатель. Ваш узел<-> Указатели юнитов остаются в силе.
Использование стирания на векторе делает недействительными указатели для всех элементов после стертого элемента.
Другие элементы будут сдвигаться вниз или вверх в памяти, когда вы используете стирание / вставка в середине вектора, и использование этих указателей теперь приведет к неопределенному поведению.
Если вы хотите сохранить эти указатели в силе, ваши варианты:
После стирания переберите вектор, который вы только что использовали, и удалите указатели элементов на другой вектор.
Используйте список. list.erase () не делает недействительными указатели / итераторы, за исключением элемента, который вы стираете, поэтому убедитесь, что вы удаляете указатель элемента, который вы стерли в другом векторе.
Недостаток списков заключается в том, что у них нет произвольного доступа, поэтому вам нужно будет выполнить итерацию, нет списка [] для вас.
Надеюсь это поможет.