我想用 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);
});
或者,如果您例如可以使用 -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/