根据 C++ 中 pair 的第一个向量排序

Sort according to first vector of pair in C++

我有以下形式的数据结构:

vector<pair<vector<unsigned>,vector<unsigned> > a;

现在我想根据对的第一个向量对向量 "a" 进行排序。例如。在下面给出的示例中,我想根据以下内容进行排名: (((1,2,4),(89,29)) , ((1,3),(67,90))). 由于a3的size大于a1的size,所以先按a3再按a1排序

E.g. If 
     vector<unsigned> a1,a3;
     a1.push_back(1); a1.push_back(3);
     vector<unsigned> a2,a4;
     a2.push_back(67); a2.push_back(90);
     a.push_back(make_pair(a1,a2));
     a3.push_back(1); a3.push_back(2); a3.push_back(4);
     a4.push_back(89); a4.push_back(29);
     a.push_back(make_pair(a3,a4));

我知道我可以使用冒泡排序进行排序。但是在 C++ 中是否有其他方法,如 STL 函数来做同样的事情。

只需将 std::sort 与比较每个 pair 的第一个元素(并使用 std::vector 中的 operator< 的函数对象(此处为 lambda)一起使用

#include <algorithm>
#include <iostream>
#include <utility>
#include <vector>

using namespace std;

int main()
{
    vector<pair<vector<unsigned>,vector<unsigned> >> a = {{{1,3},{67, 90}}, {{1,2,4},{89,29}}};
    sort(begin(a), end(a), [](auto const& L, auto const& R) {
        return L.first < R.first;
    });

    for (auto const& elem : a) {
        std::cout << "{{";
        for (auto const& u : elem.first)
            std::cout << u << ", ";
        std::cout << "},";
        std::cout << "{";
        for (auto const& u : elem.second)
            std::cout << u << ", ";
        std::cout << "}},";
    }    
}

Live Example 使用 C++14。

您可以通过使用迭代器/索引编写基于范围的 for 循环,以及编写传递给 std::sort 的单独函数对象,使其适应 C++98。哦,你还必须使用笨拙的 push_back 初始化,而不是 C++11 及更高版本中更方便的初始化列表。