gpt4 book ai didi

c++ - 过滤器列表 - C++

转载 作者:行者123 更新时间:2023-11-27 23:46:13 25 4
gpt4 key购买 nike

我想用 C++ 过滤一个列表。为此,我获得了一个比较元素的外部函数 f。基于这种比较,我决定保留哪些元素。

看来我的实现有误,你能帮我找出错误吗?

f 的示例:

bool function f(a, b){
if (a + b % 3 != 0){
return true; // keep element
}
return false; }

为了简单起见,我想强调这只是一个示例。

我的实现应该像这样工作(元素用___分隔):

1____2____3____4____5____6____7____8
^ ^
f(1, 2) == false. Discard 2.

1____3____4____5____6____7____8
^ ^
now compare the next element with 1
f(1, 3) == true. Keep 3. Move first pointer to 3

1____3____4____5____6____7____8
^ ^
Compare 3 with 4 ...

1____3____4____5____6____7____8
^ ^
remove 5, since f(4, 5) == false

1____3____4____6____7____8
^ ^
keep 6, move pointer

1____3____4____6____7____8
^ ^
1____3____4____6____7____8
^ ^
remove 8.

1____3____4____6____7
^
Nothing more to compare. Terminate.

我通过将有效元素移动到另一个列表并将迭代器移动到原始列表中的下一个元素来实现“删除”,但实际上删除它们也是可以的。

list<node> result;
list<node>::iterator i = path.begin();
element firstElement = *i;
result.push_back(firstElement);
for (; i != path.end();)
{
if (++i == path.end())
{
break;
}
// compare with next node
int d = distance(firstElement.id, (*i).id);
if (d <= (*i).valFrom)
{
// add edge to result
result.push_back(*i);
firstElement = *i;
}
}

工作示例

#include <iostream>
#include <vector>
#include <climits>
#include <algorithm>
#include <list>

using namespace std;

int f(int a, int b)
{
if (a + b % 3 == 0)
{
return false;
}
return true;
}

int main()
{

list<int> path = {1, 2, 3, 4, 5, 6, 7, 8};
list<int> result;
bool skip = false;
list<int>::iterator i = path.begin();
int firstint = *i;
result.push_back(firstint);
for (; i != path.end();)
{
if (++i == path.end())
{
break;
}
// compare with next int
if (f(firstint, *i))
{
// add edge to result
result.push_back(*i);
firstint = *i;
}
}

// output path
for (list<int>::iterator i = result.begin(); i != result.end(); ++i)
{
cout << *i << ' ';
}
}

最佳答案

我想你想要这样的东西:

std::list<int> mylist{ 1,2,3,4,5,6,7,8,9,10 };

mylist.remove_if([](auto val)
{
return ((val % 2) == 1);
});

这会从列表中删除所有不均匀的值

如果你想要另一个列表中的结果:

std::list<int> mylist{ 1,2,3,4,5,6,7,8,9,10 };
std::list<int> mylistFilered;

std::copy_if(mylist.begin(), mylist.end(), std::back_inserter(mylistFilered),[](auto val)
{
return ((val % 2) == 1);
});

对于基于 2 个连续元素的过滤器,我们需要一个小帮助列表。例如像这样:

std::list<int> mylist{ 1,2,3,5,7,4,5,6,7,8,9,10 };
std::list<int> keepElement;
std::list<int> mylistFilered;

std::transform(mylist.begin(), --mylist.end(), ++mylist.begin(), std::back_inserter(keepElement),[](auto a, auto b)
{
return ((a + b) % 3 != 0);
});

或者,如果您have 可以像这样使用 -1 作为无效值:

std::list<int> mylist{ 1,2,3,5,7,4,5,6,7,8,9,10 };
std::list<int> mylistFilered;

std::transform(mylist.begin(), --mylist.end(), ++mylist.begin(), std::back_inserter(mylistFilered),[](auto a, auto b)
{
if ((a + b) % 3 != 0)
return a;
else
return -1;
});

mylistFilered.remove_if([](auto val)
{
return (val == -1);
});

关于c++ - 过滤器列表 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50398028/

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