我有以下形式的数据结构:
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函数一样的方法来做同样的事情。
答案 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及更高版本中更方便的初始化列表。