Есть ли способ подсчитать количество удалений, выполненных функцией remove_if в STL?
В частности, я передаю итераторы вперед и назад каждому из векторов целых чисел, и в качестве сравнительного значения для delete_if я использую лямбду в качестве третьего аргумента, чтобы определить, следует ли удалять вектор на основе значений в векторе. Я хочу знать, есть ли способ узнать количество векторов, удаленных с помощью remove_if впоследствии.
Кроме того, в качестве дополнительного вопроса: я объявляю эти векторы динамически, поэтому я не уверен, является ли вызов remove_if для них плохой практикой.
Подсчитайте количество элементов до 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;
Более длинный ответ (хотя @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