猿问

如何根据对的第二个元素对对向量进行排序?

如何根据对的第二个元素对对向量进行排序?

如果我有一对矢量:

std::vector<std::pair<int, int> > vec;

是否有简单的方法根据对的第二个元素按递增顺序对列表进行排序?

我知道我可以编写一个可以完成工作的小函数对象,但是有没有办法使用STL的现有部分并std::less直接进行工作?

编辑:我明白我可以编写一个单独的函数或类来传递给第三个参数进行排序。问题是我是否可以用标准的东西来构建它。我真的看起来像:

std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());



炎炎设计
浏览 569回答 3
3回答

qq_笑_17

使用c ++ 14,由于lambda现在可以有类型的参数,因此最好的解决方案非常容易编写auto。这是我目前最喜欢的解决方案std::sort(v.begin(),&nbsp;v.end(),&nbsp;[](auto&nbsp;&left,&nbsp;auto&nbsp;&right)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;left.second&nbsp;<&nbsp;right.second;});只需使用自定义比较器(它是可选的第三个参数std::sort)struct&nbsp;sort_pred&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;operator()(const&nbsp;std::pair<int,int>&nbsp;&left,&nbsp;const&nbsp;std::pair<int,int>&nbsp;&right)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;left.second&nbsp;<&nbsp;right.second; &nbsp;&nbsp;&nbsp;&nbsp;}};std::sort(v.begin(),&nbsp;v.end(),&nbsp;sort_pred());如果您使用的是C ++ 11编译器,则可以使用lambdas编写相同的代码:std::sort(v.begin(),&nbsp;v.end(),&nbsp;[](const&nbsp;std::pair<int,int>&nbsp;&left,&nbsp;const&nbsp;std::pair<int,int>&nbsp;&right)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;left.second&nbsp;<&nbsp;right.second;});编辑:为了回应您对问题的编辑,这里有一些想法...如果您真的想要有创意并且能够重复使用这个概念,那么只需制作一个模板:template&nbsp;<class&nbsp;T1,&nbsp;class&nbsp;T2,&nbsp;class&nbsp;Pred&nbsp;=&nbsp;std::less<T2>&nbsp;>struct&nbsp;sort_pair_second&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;operator()(const&nbsp;std::pair<T1,T2>&left,&nbsp;const&nbsp;std::pair<T1,T2>&right)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pred&nbsp;p; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;p(left.second,&nbsp;right.second); &nbsp;&nbsp;&nbsp;&nbsp;}};那么你也可以这样做:std::sort(v.begin(),&nbsp;v.end(),&nbsp;sort_pair_second<int,&nbsp;int>());甚至std::sort(v.begin(),&nbsp;v.end(),&nbsp;sort_pair_second<int,&nbsp;int,&nbsp;std::greater<int>&nbsp;>());虽然说实话,这有点矫枉过正,只需编写3行功能并完成它:-P

守候你守候我

你可以像这样使用boost:std::sort(a.begin(),&nbsp;a.end(),&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::bind(&std::pair<int,&nbsp;int>::second,&nbsp;_1)&nbsp;< &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;boost::bind(&std::pair<int,&nbsp;int>::second,&nbsp;_2));我不知道一种标准的方法来做到这一点同样简短,但你可以抓住boost::bind它所有的标题。

慕容708150

它非常简单,您可以使用算法中的sort函数并添加自己的比较函数vector<&nbsp;pair<int,int&nbsp;>&nbsp;>&nbsp;v;sort(v.begin(),v.end(),myComparison);现在你必须根据第二个选择进行比较,因此将“myComparison”声明为bool&nbsp;myComparison(const&nbsp;pair<int,int>&nbsp;&a,const&nbsp;pair<int,int>&nbsp;&b){ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;a.second<b.second;}
随时随地看视频慕课网APP
我要回答