Lambda 在基于图形的环境中过滤和排序交替路径

Lambda 在基于图形的环境中过滤和排序交替路径,lambda,c++17,variadic-templates,Lambda,C++17,Variadic Templates,由于我不知道如何直接提问,我想一步一步地介绍这个问题: 想象一个(包装)对象的向量,你需要排序和过滤。 通常,我会这样做: class-Foo { 巴*巴 int CalcDistance();//在条形图上操作; std::vector GetObjects();//在条上操作; }; std::vector进程() { std::vector foos=GetFoosFromsomeone(); std::向量电位; 自动_过滤器=[&](自动foo){ 返回foo->CalcDistanc

由于我不知道如何直接提问,我想一步一步地介绍这个问题:

想象一个(包装)对象的向量,你需要排序和过滤。 通常,我会这样做:

class-Foo
{
巴*巴
int CalcDistance();//在条形图上操作;
std::vector GetObjects();//在条上操作;
};
std::vector进程()
{
std::vector foos=GetFoosFromsomeone();
std::向量电位;
自动_过滤器=[&](自动foo){
返回foo->CalcDistance()GetObjects().empty();
};
std::copy_if(foos.begin()、foos.end()、potentialFoos.begin()、_过滤器);
自动分拣机=[&](自动左侧、自动右侧){返回左侧->计算距离()>右侧->计算距离();};
std::sort(potentialFoos.begin()、potentialFoos.end()、排序器);
回报潜力;
}
不幸的是,我不需要过滤Foos向量。相反,当给定一个目标(图中的顶点)时,单个查询操作一个图并返回多个结果

如果有三种可能到达目标,则分别得到三个距离和三个对象向量

class-Foo
{
巴*巴
std::vector CalcDistance(顶点目标);//基于图形在条形图上操作;
std::vector GetObjects(顶点目标);//基于图形在条形图上操作;
};
我希望有一种简单的(表达性的)方法来排序和过滤替代路径,从而达到相同的目标。我能想象的是这样的:

//伪代码
Foo-Foo=GetFooFromSomewhere();
std::vector targets=GetTargetsFromSomewhere();
自动过滤=[](距离d,对象o){返回d
我已经在使用可变模板和折叠表达式来分解lambdas中的单个查询对象(这里是距离和对象)方面取得了一些进展(请参见),但它(a)不完整,(b)没有我希望的那么好表达,(c)当然是“今年的重塑”

最终目标是隐藏对包装条对象的底层方法调用的复杂性,使最终用户能够扩展查询,例如通过模板专门化

问题是我对重新发明方向盘的感觉,我很确定,有一些更好的方法可以做到这一点(例如,在boost图的顶部有一些不错的东西)


任何想法(改进)?

std::copy_if(foos.begin()、foos.end()、potentialFoos.begin()、过滤器)表现出未定义的行为,通过超出容器边界的写入方式
potentialFoos
是一个空向量。好的,除非
过滤器总是返回
false
,谢谢Igor的评论。幸运的是,这不是真正的代码(我的脑子里写出来的)——刚刚学会:在C++中不做捷径。