为什么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
进行排序?
答案 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<
进行排序,则可以随时执行此操作。