【问题标题】:counting deletions in remove_if (c++ STL)在 remove_if (c++ STL) 中计算删除
【发布时间】:2016-03-17 04:14:51
【问题描述】:

有没有办法统计STL中remove_if函数删除的次数?

具体来说,我将前向和后向迭代器分别传递给整数向量,并将 lambda 作为第三个参数作为 remove_if 的比较值,以确定是否应根据向量中的值删除向量。我想知道是否有办法知道 remove_if 之后删除的向量数量。

另外,作为一个附带问题:我动态声明这些向量,所以我不确定在这些上调用 remove_if 是否是不好的做法。

【问题讨论】:

  • 使用 lambda 进行比较,并让它在每次返回 true 时增加一个计数器?

标签: c++ stl remove-if


【解决方案1】:

计算 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;

【讨论】:

  • 感谢您的帮助!
  • 没问题!
【解决方案2】:

更长的答案(尽管@kukac 的)是正确的。

remove 和 (remove_if) 实际上并没有从向量中删除元素;他们只是将它们打乱到最后,并将迭代器返回到“已删除”元素的开头。要真正摆脱它们,请致电erase。这就是所谓的“erase-remove idiom”,关于它的帖子很多。

像这样(未编译的代码):

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-13
    • 2020-11-22
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多