Самое простое решение - вообще не удалять элемент из вектора, а просто заменить его нулевым указателем.Это означает, что при выполнении итерации по полному вектору необходимо проверить наличие нулевых указателей, но это обычно не является большой проблемой.И чтобы предотвратить бесконечный рост вектора, вы должны иметь возможность повторно использовать слоты;либо вы сканируете вектор на нулевой указатель (std::find
) при вставке, либо вы поддерживаете какой-то список свободных слотов.
Обратите внимание, что если ваш идентификатор будет использоваться в качестве индекса для вектора, вы не хотите генерировать его независимо.Если вы вставляете, используя push_back
(поскольку в векторе не было нулевых указателей), идентификатор равен v.size() - 1
после push_back
или просто v.size()
перед;если вы вставляете в определенное место, используя итератор, возвращаемый std::find
, то идентификатор этого итератора - v.begin()
.Если вы просто используете линейный поиск (и с таким вектором, как 1000 элементов, этого вполне достаточно), то должно сработать что-то вроде следующего:
// returns index of inserted element
int
insertIntoVector( std::vector<MyType*>& index, MyType* newObject )
{
std::vector<MyType*>::iterator position
= std::find( index.begin(), index.end(), NULL );
int results = position - index.begin();
if ( position == index.end() ) {
index.push_back( newObject );
} else {
*position = newObject;
}
return results;
}
Если вы кэшируете свободные слотызамените std::find
на соответствующий код, чтобы найти свободный слот.