Здравствуйте, Кодт, Вы писали:
К>Есть другая тонкость.
К>remove_if не обязан помещать удалённые элементы в хвост — в отличие от partition.
К>То есть, может делать swap, move или даже копирующее присваивание.
К>А в хвосте оказывается произвольный мусор (валидные, но бесполезные элементы). И всё, что с ними остаётся сделать — это erase.
http://www.rsdn.ru/forum/cpp/5234995.1Автор: Evgeny.Panasyuk
Дата: 19.07.13
К>Выгоднее будет написать unstable_remove / unstable_remove_if
[...]
я тоже думал сейчас сделать такой, но вошёл в цикл поиска нормального названия и не вышел, почему-то в голову лезло только "nonstable" — что казалось слишком некрасиво.
К>(скопипастил с cppereference.com и подправил две строки)
Копипастить нужно Степанова, например с SGI STL или с Notes — потому что, во-первых у него колличество операций оптимизировано, а во-вторых работает:
template<typename I, typename P>
/*
requires
(
Mutable(I) && BidirectionalIterator(I) &&
UnaryPredicate(P) && ValueType(I) == Domain(P)
)
*/
I unstable_remove_if(I first, I last, P p)
{
while (true)
{
while (true)
if (first == last)
return first;
else if (!p(*first))
++first;
else
break;
--last;
while (true)
if (first == last)
return first;
else if (p(*last))
--last;
else
break;
*first = std::move(*last);
++first;
}
}
Код же с cppereference.com на пустом range делает last--

(кстати, они его сами написали или откуда-то взяли?)