std :: sort如何用于列表对?

时间:2014-05-22 20:49:13

标签: c++ algorithm sorting stl std

为什么this

#include <iostream>
#include <string>
#include <vector>                                                             
#include <algorithm>

using namespace std;

vector<pair<int, string>> list;

int main() {
    int one = 1, two = 2, three =3, five =5, six = 6;
    string bla = "bla";

    list.push_back( pair<int, string>(two, bla));
    list.push_back( pair<int, string>(one, bla));
    list.push_back( pair<int, string>(two, bla));
    list.push_back( pair<int, string>(six, bla));
    list.push_back( pair<int, string>(five, bla));

    sort(list.begin(), list.end());

    for(auto item : list) {
        cout << item.first << endl;
    }
}

按预期工作?输出是:

1
2
2
5
6

std::sort如何对我的int-string对进行排序?如何使它成为我的某类课程first?有没有办法按second使用std::sort进行排序?

2 个答案:

答案 0 :(得分:6)

由于std::pair是为std::pair::first定义的,它基于std::pair::second,然后是std::pair(词典编纂),因此您的代码正在作为标准。要根据std::sort(list.begin(), list.end(), [](const std::pair<int, string> &x, const std::pair<int, string> &y) { return x.second < y.second; }); 的第二部分对其进行排序,您可以尝试这样做:

{{1}}

答案 1 :(得分:5)

有一个&#34;显而易见的&#34;由组件的相应排序引起的产品类型的排序,即lexicographical order

(a, b) < (c, d)  <=>  a < c || (a == c && b < d)

这是operator< std::pair使用的排序。在您的示例中,由于所有第一个组件都是不同的,因此排序恰好等于第一个组件的排序。如果在第一个组件中有多个相同值的出现,其中第二个组件用于断开关系,则会更有趣。

  

如何让它成为我的某些类别的第一对?

您只需为您的类型定义operator<即可。但请记住,如果需要,将考虑第二个组件 ,您可能不需要这种开销。

  

有没有办法按second使用std::sort进行排序?

是的,只需使用custom comparator functor即可。如果您不想使用默认operator<进行排序,则可以随时执行此操作。