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

时间:2015-02-06 10:34:26

标签: c++ algorithm sorting vector std-pair

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

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

现在我想对矢量&#34; a&#34;进行排序。根据对的第一个向量。例如。在下面给出的示例中,我想根据以下排名: (((1,2,4),(89,29)) , ((1,3),(67,90))).由于a3的大小大于a1的大小,因此首先根据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函数一样的方法来做同样的事情。

1 个答案:

答案 0 :(得分:2)

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

#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及更高版本中更方便的初始化列表。