Скажем, у нас есть:
struct IsEven {
bool operator() (int i) { return i % 2 == 0; }
};
Тогда:
vector<int> V; // fill with ints
vector<int>::iterator new_end = remove_if(V.begin(), V.end(), IsEven());
V.erase(new_end, V.end());
работает нормально (оставляет V
только с нечетными целыми числами). Но похоже, что элементы от new_end
до V.end()
являются , а не четными целыми числами, которые мы удаляем. Например, если v
начинается как 1 4 2 8 5 7
, тогда я получаю 8 5 7
для этих элементов (хотя после вызова erase
вектор действительно имеет 1 5 7
слева).
По-видимому, (согласно http://www.sgi.com/tech/stl/remove_if.html)
The iterators in the range [new_last, last) are all still dereferenceable,
but the elements that they point to are unspecified.
Прежде всего, WTF? И во-вторых, как мне обойти это без существенного переопределения remove_if
?