Что касается алгоритма, удаление набора элементов из смежного массива может быть эффективно сделано из двух частей.
- Переместите все элементы, которые не должны быть удалены, в началоarray.
- Отметить массив поменьше.
Это можно сделать в C++
с идиомой удаления-удаления.
vector<T> v; // v = {0,1,2,3,0,0,7};
vector<T>::iterator it = remove(v.begin(),v.end(),e);
// move all elements not to be deleted to the front
// Yes, remove is not the brightest name for that.
// Especially as list::remove really remove elements from the list.
// now v = {1,2,3,7,?,?,?} results marked in question marks
// are implementation dependent.
v.erase(it,v.end());
// get rid of the elements marked as question marks.
// v = {1,2,3,7}
Теперь содержимоеэлементов в вопросительном знаке неизвестно.Единственное, что мы можем с ними сделать, это избавиться от них (перезаписав их или удалив).
Есть ли в реальной ситуации ситуация, когда вам нужно использовать remove
без стирания?Единственная ситуация, о которой я могу подумать, это
copy(src.begin(),src.end(),remove(v.begin(),v.end(),e),v.end());
, заменив все A
с B
с, и требуя, чтобы все эти новые B
были смежными.Не имеет особого смысла.
edit : Имеет ли это смысл для чего-либо кроме контейнера памяти (на самом деле deque
и vector
)?
Если я действительно прав, почему он был реализован как отдельный алгоритм, а не vector::remove_if
, dequeue::remove_if
и т. Д.