对内部包含 2 对的向量进行排序

Sorting a vector with 2 pairs inside

嗯,我有一个向量,对>,我想知道他是如何排序的?用排序(v.begin(),v.end());

using namespace std;

int main(){
   int n; cin >> n;
   vector<pair<pair<int,int>, pair<int,int>>> v;
   for(int i=0;i<n;i++){
      long long x1,y1,x2,y2;
      cin>>x1>>y1>>x2>>y2;
      v.push_back(make_pair(make_pair(x1,y1),make_pair(x2,y2)));
   }   
   sort(v.begin(),v.end());
   for(auto& p : v){
      cout<<p.first.first<<" "<<p.first.second<<" "<<p.second.first<<" "<<p.second.second<<"\n";
  }
   return 0;
}

输入:

4   
5 19 8 17
5 15 15 5
0 20 20 0
8 10 10 8

输出:

0 20 20 0
5 15 15 5
5 19 8 17
8 10 10 8

std::pair defines a operator< 如果包含的类型支持通过 operator< 进行比较,而您使用的是 int,则默认提供。

std::sort 使用此 operator< 对元素 lexicographically.

进行排序

如果您使用的是未定义 operator< 的任意类型,则必须提供您自己的比较器 std::sort

对于 class std::pair 有定义的运算符

template<class T1, class T2>
constexpr bool operator< (const pair<T1, T2>&, const pair<T1, T2>&);

按以下方式运作

Returns: x.first < y.first || (!(y.first < x.first) && x.second < y.second).

例如,对于两对 std::pair<std::pair<int, int>, std::pair<int, int>>

{ { 5, 19 }, { 8, 17 } }
  ^^^^^^^^^

{ { 5, 15 }, { 15, 5 } }
  ^^^^^^^^^

首先使用相同的 operator <.

{ 5, 19 }{ 5, 15 } 进行比较

由于第二对小于第一对,因此第二对将在结果向量中的第一对之前。

如果他们(第一对)彼此相等,例如

{ { 5, 15 }, { 8, 17 } }
  ^^^^^^^^^

{ { 5, 15 }, { 15, 5 } }
  ^^^^^^^^^

然后比较第二对。因为 { 8, 17 } 小于 { 15, 5 } ,所以第一对小于第二对。

{ 8, 17 }{ 15, 5 } 对使用相同的模板 operator < 进行比较。