c++ - 如何根据对的第二个元素对对的 vector 进行排序?

标签 c++ stl stdvector

如果我有一对 vector :

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

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

我知道我可以编写一个小函数对象来完成这项工作,但是有没有办法使用 STLstd::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/

相关文章:

c++ - 在 Linux-64 上编译 NeHe(或其他面向 32 位的)示例

c++ - 安全使用 C++ STL 的规则/指南

c++ - void Print(vector<string>) 函数不打印

c++ - 用于筛选的最佳数据结构是什么(即一些数字被划掉的列表)?

c++ - Qt5 - 在 QML TableView 中显示动态数据模型

c++ - 带指针的引用和右引用

c++ - 大多数 C++ 风格的检查值是否属于某个静态集的方法

c++ - 为什么 std::whatever::erase() 是一个方法而 std::remove() 是一个独立函数?

c++ - std::hash_set vs std::unordered_set,它们是一回事吗?

c++ - 在基于范围的循环与标准循环中删除 vector 元素