过滤器列表-C++; 我想在C++中筛选一个列表。为此,我提供了一个外部函数f,用于比较元素。基于这种比较,我决定保留哪些元素
看来我的实现是错误的,你能帮我找到错误吗? f的例子:过滤器列表-C++; 我想在C++中筛选一个列表。为此,我提供了一个外部函数f,用于比较元素。基于这种比较,我决定保留哪些元素,c++,list,filter,iterator,C++,List,Filter,Iterator,看来我的实现是错误的,你能帮我找到错误吗? f的例子: bool function f(a, b){ if (a + b % 3 != 0){ return true; // keep element } return false; } 我想强调的是,这只是一个简单的例子 我的实现应该像这样工作(元素之间用__;分隔): 我通过将有效元素移动到另一个列表并将迭代器移动到原始列表中的下一个元素来实现“删除”,但实际上删除它们也可以 list<node> result; lis
bool function f(a, b){
if (a + b % 3 != 0){
return true; // keep element
}
return false; }
我想强调的是,这只是一个简单的例子
我的实现应该像这样工作(元素之间用__;分隔):
我通过将有效元素移动到另一个列表并将迭代器移动到原始列表中的下一个元素来实现“删除”,但实际上删除它们也可以
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;
}
}
列表结果;
列表::迭代器i=path.begin();
元素firstElement=*i;
结果。推回(第一个元素);
对于(;i!=path.end();)
{
如果(++i==path.end())
{
打破
}
//与下一个节点比较
int d=距离(firstElement.id,(*i).id);
如果(d我想你想要这样的东西:
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 mylist{1,2,3,4,5,6,7,8,9,10};
mylist.remove_if([](自动val)
{
返回((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);
});
std::list mylist{1,2,3,4,5,6,7,8,9,10};
std::list mylistFilered;
std::copy_if(mylist.begin()、mylist.end()、std::back_插入器(mylistFilered),[](自动val)
{
返回((val%2)=1);
});
对于基于2个conrequisive元素的过滤器,我们需要一个小帮助列表。例如:
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);
});
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);
});
std::list mylist{1,2,3,5,7,4,5,6,7,8,9,10};
std::列表保留;
std::list mylistFilered;
std::transform(mylist.begin(),--mylist.end(),++mylist.begin(),std::back_插入器(keeplement),[](自动a,自动b)
{
返回((a+b)%3!=0);
});
或者,如果您有,可以使用-1作为无效值,如下所示:
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);
});
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);
});
std::list mylist{1,2,3,5,7,4,5,6,7,8,9,10};
std::list mylistFilered;
std::transform(mylist.begin(),--mylist.end(),++mylist.begin(),std::back_插入器(mylistFilered),[](自动a,自动b)
{
如果((a+b)%3!=0)
返回a;
其他的
返回-1;
});
mylistFilered.if([](自动val)删除\u
{
返回值(val==-1);
});
这是使用调试器的一个很好的例子,一步一步地执行。这也是使用单元测试的一个很好的例子。无论如何,我不确定你是否已经在这样做了,但是像这样的过滤通常比复制甚至移动到第二个列表更麻烦。在任何情况下,请自己编写一个逐步定义你想用简单的散文来实现你的算法。它有助于中间步骤将它翻译成C++ + Luton。@ ULRICECKHART,这就是为什么我不在适当的地方做它,但将它编译到RESUTF是从LabBARE提供的。你可以假设它是正确的,因为它被彻底地测试了。我不想使这个帖子过于复杂。,这就是为什么我编了一个新的f@n.m.我包括了一个工作示例。它做了它应该做的,但显然不是总是这样。我必须将它稍微更改为这样的东西…我怎么做呢?std::copy_if(path.begin(),path.end(),std::back_inserter(result),[](auto val){return(distance(firstElement,SecondElement));});因为我不关心某个特定元素的“均匀性”,而是关心两个元素组合的“均匀性”。这不是我问题的解决方案。如果您尝试此解决方案(输入1,2,3,4,5,6,7,8),它将输出一个包含元素2,3,5,6的列表。正确的解决方案是包含元素1,3,4,6的列表