Я хотел бы предложить, что это пример использования std::list
. Вы можете объединить участников из одного списка в другой. Посмотрите на std :: list :: splice () для этого.
Вам нужен произвольный доступ? Если нет, то вам не нужно std::vector
.
Обратите внимание, что со списком, когда вы склеиваете, ваши итераторы и ссылки на объекты в списке остаются действительными.
Если вы не против сделать реализацию "навязчивой", ваши объекты могут содержать свое собственное значение итератора, чтобы они знали, где они находятся. Затем, когда они меняют состояние, они могут автоматизировать свое собственное «перемещение» из одного списка в другой, и вам не нужно пересекать весь список для них. (Если вы хотите, чтобы эта развертка произошла позже, вы можете заставить их «зарегистрироваться» для последующего перемещения).
Я напишу здесь алгоритм, чтобы он проходил через одну коллекцию, и, если условие существует, оно повлияет на std :: remove_if, но в то же время скопирует элемент в ваш «инсертор».
//fwd iterator must be writable
template< typename FwdIterator, typename InputIterator, typename Pred >
FwdIterator copy_and_remove_if( FwdIterator inp, FwdIterator end, InputIterator outp, Pred pred )
{
for( FwdIterator test = inp; test != end; ++test )
{
if( pred(*test) ) // insert
{
*outp = *test;
++outp;
}
else // keep
{
if( test != inp )
{
*inp = *test;
}
++inp;
}
}
return inp;
}
Это немного похоже на std::remove_if
, но скопирует удаляемые в альтернативную коллекцию. Вы бы вызвали его так (для вектора), где isInactive является допустимым предикатом, который указывает, что его следует переместить.
active.erase( copy_and_remove_if( active.begin(), active.end(), std::back_inserter(inactive), isInactive ), active.end() );