计算 remove_if 中的删除(c++ STL)
counting deletions in remove_if (c++ STL)
有什么方法可以统计STL中remove_if函数的删除次数吗?
具体来说,我将前向和后向迭代器分别传递给整数向量,并将 lambda 作为第三个参数作为 remove_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 的)是正确的。
remove
和 (remove_if
) 实际上并不 从向量中移除 元素;他们只是将它们洗牌到最后,return 一个迭代器到 "removed" 元素的开头。要真正摆脱它们,您可以调用 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
有什么方法可以统计STL中remove_if函数的删除次数吗?
具体来说,我将前向和后向迭代器分别传递给整数向量,并将 lambda 作为第三个参数作为 remove_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 的)是正确的。
remove
和 (remove_if
) 实际上并不 从向量中移除 元素;他们只是将它们洗牌到最后,return 一个迭代器到 "removed" 元素的开头。要真正摆脱它们,您可以调用 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