我在尝试对类型为vector的矢量进行排序时遇到了麻烦:
vector<pair<string, pair<string, int>>>
我希望它们在第一对的第一个字符串之后排序。
sort(all_pairs.begin(), all_pairs.end(), comp);
其中all_pairs是我的向量,comp是
bool comp(const pair<string, pair<string, int>> &a, const pair<string, pair<string, int>> &b)
{
string term1 = a.first;
string term2 = b.first;
return term1<term2;
}
所以,如果我的初始向量是:
(Z,(A,1))
(Y,(A,2))
(X,(A,3))
我希望我的输出为:
(X,(A,3))
(Y,(A,2))
(Z,(A,1))
答案 0 :(得分:1)
您的代码确实work,所以我不确定问题是什么。
vector<pair<string, pair<string, int>>> v =
{
std::make_pair("Z", std::make_pair("a", 1)),
std::make_pair("Y", std::make_pair("a", 2)),
std::make_pair("X", std::make_pair("a", 3)),
};
std::sort(v.begin(), v.end(), comp);
for (const auto& p : v)
{
std::cout << "(" << p.first << ","
<< "(" << p.second.first << ","
<< p.second.second << "))\n";
}
输出:
(X,(a,3))
(Y,(a,2))
(Z,(a,1))
您可以通过删除不必要的局部变量来略微改善比较器功能:
return a.first < b.first;
答案 1 :(得分:1)
顺便说一句,要扩展上面的副本评论,这里有两个版本,只有少许增强功能。 更便宜:
bool comp(const pair<string, pair<string, int>> &a, const pair<string, pair<string, int>> &b)
{
const string& term1 = a.first; // saves copying these strngs for no reason
const string& term2 = b.first;
return term1<term2;
}
更短更便宜:
bool comp(const pair<string, pair<string, int>> &a, const pair<string, pair<string, int>> &b)
{
return a.first<b.first;
}
答案 2 :(得分:0)
使用std::pair
或<
std::tie
typedef std::pair<std::string, std::pair<std::string, int> > P;
struct X{
bool operator ( ) (const P& lhs, const P& rhs )
{
// return std::tie( lhs.first, lhs.second.first, lhs.second.second)
// < std::tie( rhs.first, rhs.second.first, rhs.second.second) ;
return lhs < rhs ;
}
};
std::sort(vec.begin() , vec.end() , X());
演示here
我不在乎你的代码是否有效:P我做了一些“努力”