gpt4 book ai didi

c++ - 使用 std::remove_if 跟踪删除的元素

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:56:44 25 4
gpt4 key购买 nike

我想从 vector 中删除一些元素,我正在使用 remove_if 算法来执行此操作。但是我想跟踪删除的元素,以便以后可以对它们执行一些操作。我尝试使用以下代码:

#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;


struct IsEven
{
bool operator()(int n)
{
if(n % 2 == 0)
{
evens.push_back(n);
return true;
}

return false;
}

vector<int> evens;
};

int main(int argc, char **argv)
{

vector<int> v;
for(int i = 0; i < 10; ++i)
{
v.push_back(i);
}

IsEven f;
vector<int>::iterator newEnd = remove_if(v.begin(), v.end(), f);
for(vector<int>::iterator it = f.evens.begin(); it != f.evens.end(); ++it)
{
cout<<*it<<"\n";
}

v.erase(newEnd, v.end());

return 0;
}

但这不起作用,因为 remove_if 接受了我的仿函数对象的 copy,因此无法访问存储的 evens vector 。实现这一目标的正确方法是什么?

附言:这个例子,偶数和奇数只是为了举例,我的真实代码有些不同。因此,不要建议以不同方式识别偶数或赔率的方法。

最佳答案

解决方案不是remove_if,而是表亲 partial_sort partition。区别在于remove_if只保证[begin, middle)包含匹配的元素,而partition也保证[middle, end) 包含与谓词不匹配的元素。

因此,您的示例变成了(注意不再需要 evens):

vector<int>::iterator newEnd = partition(v.begin(), v.end(), f);
for(vector<int>::iterator it = newEnd; it != v.end(); ++it)
{
cout<<*it<<"\n";
}
v.erase(newEnd, v.end());

关于c++ - 使用 std::remove_if 跟踪删除的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9563517/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com