如果我有一对 vector :
std::vector<std::pair<int, int> > vec;
有没有简单的方法根据对中的第二个元素按递增顺序对列表进行排序?
我知道我可以编写一个小函数对象来完成这项工作,但是有没有办法使用 STL 和 std::less
的现有部分来直接干活?
编辑:我知道我可以编写一个单独的函数或类来传递给第三个参数进行排序。问题是我是否可以用标准的东西来构建它。我真的想要看起来像这样的东西:
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
最佳答案
编辑:使用 c++14,最好的解决方案非常容易编写,这要归功于现在可以具有 auto
类型参数的 lambda。 这是我目前最喜欢的解决方案
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
原始答案:
只需使用自定义比较器(它是 std::sort
的可选第三个参数)
struct sort_pred {
bool operator()(const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
}
};
std::sort(v.begin(), v.end(), sort_pred());
如果您使用的是 C++11 编译器,则可以使用 lambdas 编写相同的代码:
std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
});
编辑:针对您对问题的编辑,这里有一些想法...... 如果您真的想要有创意并且能够大量重用这个概念,只需制作一个模板:
template <class T1, class T2, class Pred = std::less<T2> >
struct sort_pair_second {
bool operator()(const std::pair<T1,T2>&left, const std::pair<T1,T2>&right) {
Pred p;
return p(left.second, right.second);
}
};
那么你也可以这样做:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
甚至
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
老实说,这有点矫枉过正,只需编写 3 行函数即可:-P
关于c++ - 如何根据对的第二个元素对对的 vector 进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/279854/