подсчет удалений в remove_if (c ++ STL)

Есть ли способ подсчитать количество удалений, выполненных функцией remove_if в STL?

В частности, я передаю итераторы вперед и назад каждому из векторов целых чисел, и в качестве сравнительного значения для delete_if я использую лямбду в качестве третьего аргумента, чтобы определить, следует ли удалять вектор на основе значений в векторе. Я хочу знать, есть ли способ узнать количество векторов, удаленных с помощью remove_if впоследствии.

Кроме того, в качестве дополнительного вопроса: я объявляю эти векторы динамически, поэтому я не уверен, является ли вызов remove_if для них плохой практикой.

0

Решение

Подсчитайте количество элементов до remove_if и после.

auto old_size = list.size();
auto new_end = std::remove_if(list.begin(), list.end(), ...);
auto new_size = std::distance(list.begin(), new_end);
auto deletions = old_size - new_size;
5

Другие решения

Более длинный ответ (хотя @kukac’s) правильный.

remove а также (remove_if) на самом деле не Удалить элементы из вектора; они просто перемешивают их до конца и возвращают итератор в начало «удаленных» элементов. Чтобы на самом деле избавиться от них, вы звоните erase, Это называется «идиома удаления-удаления», и об этом много сообщений.

Вот так (некомпилированный код):

vector<int> v = {1,2,3,4,5}; // v.size() == 5
auto it = remove_if(v.begin(), v.end(), is_odd);
// now v looks something like this: {2,4,5,1,3}
//   the v.size() is still == 5
//   and it "points to" '5'
v.erase(it, v.end()); // erase all the elements that were "removed"// now v looks something like this: {2,4}
//   the v.size() is now == 2
0

По вопросам рекламы [email protected]