При всем уважении к тяжелой работе Фреда позвольте мне добавить следующее: move_if
ничем не отличается от remove_copy_if
на абстрактном уровне. Единственное изменение уровня реализации - итератор end()
. Вы все еще не получаете erase()
. Принятый ответ не erase()
соответствующих элементов - часть постановки задачи ОП.
Что касается вопроса ОП: то, что вы хотите - это соединение на месте. Это возможно для списков. Однако с vectors
это не будет работать. Читайте о том, когда и как и почему итераторы признаны недействительными. Вам нужно будет использовать алгоритм двух проходов.
remove_copy_if
и другие алгоритмы могут только переупорядочивать элементы в контейнере,
Из документации SGI по remove_copy_if
:
Эта операция стабильна, это означает, что относительный порядок копируемых элементов такой же, как в диапазоне [first, last).
Так что никакого относительного переупорядочения не происходит. Более того, это копия, которая означает, что элементы из Source
vector
в вашем случае копируются в Container vector
.
как я могу вызвать стирание в исходном контейнере?
Вам нужно использовать другой алгоритм, который называется remove_if
:
remove_if
удаляет из диапазона [first, last)
каждый элемент x
, так что pred(x)
имеет значение true. То есть remove_if
возвращает итератор new_last
, так что диапазон [first, new_last)
не содержит элементов, для которых pred
имеет значение true. Все итераторы в диапазоне [new_last, last)
все еще разыменовываются, но элементы, на которые они указывают, не определены. Remove_if
стабильно, это означает, что относительный порядок элементов, которые не удалены, не изменяется.
Итак, просто измените этот remove_copy_if
вызов на:
vector<string>::iterator new_last = remove_if(Strings.begin(),
Strings.end(),
Pred);
и все готово. Просто имейте в виду, ваш диапазон Strings vector
больше не определяется итераторами [first(), end())
, а [first(), new_last)
.
Вы можете, если хотите, удалить оставшиеся [new_last, end())
следующим образом:
Strings.erase(new_last, Strings.end());
Теперь ваши vector
сокращены, а end()
и new_last
одинаковы (один за последним элементом), поэтому вы можете использовать как всегда:
copy(Strings.begin(), Strings.end(), ostream_iterator(cout, "\"));
чтобы получить распечатку строк на вашей консоли (stdout
).