对对矢量进行排序

时间:2013-12-24 16:25:04

标签: c++ sorting vector stl

我在尝试对类型为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))

你帮我冷吗? 谢谢。
[编辑]:正如我所说,代码是一个更大的程序的一部分,所以我的代码一定有问题。我会更新这个,因为我会取得进展。感谢。

3 个答案:

答案 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我做了一些“努力”