【问题标题】:Sorting a std::vector<std::pair<std::string,bool>> by the string?按字符串对 std::vector<std::pair<std::string,bool>> 进行排序?
【发布时间】:2011-06-04 08:36:31
【问题描述】:

我如何通过比较pair.first 这是std::string 来排序这个vector? (不提供静态比较功能,也不使用 boost)。

【问题讨论】:

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


    【解决方案1】:
    std::vector<std::pair<std::string, bool> > v;
    std::sort(v.begin(), v.end());
    

    std::pair 重载operator&lt; 以首先按first 元素排序,然后按second 元素排序。因此,如果您只使用默认排序顺序 (operator&lt;) 对 vector 进行排序,您将获得所需的顺序。

    【讨论】:

    • 这是一个仅限 C++0x 的答案。 ;) 编辑:现在已修复(&gt;&gt; 标记关闭两个嵌套模板 &lt;&gt; 对仅适用于 C++0x)。
    • @Charles:哈!是的,我可能在很多答案中都这样做。我太习惯使用支持&gt;&gt;的编译器了。
    • +1:我不知道std::pair::operator&lt;() 已超载。我现在做!
    • 只是为了挑剔,这要求对中的第二个项目具有&lt; 定义。如果第二种类型不可排序,那么这将失败。
    • @edA:是的。 OP 的对有一个 bool 作为它的第二个元素类型,这是可比较的。
    【解决方案2】:

    您可以使用自定义比较器仅对配对的.first 进行排序。

    sort(begin, end,
         compose2(less<string>(),
                  select1st<pair<string, bool> >(),
                  select1st<pair<string, bool> >()));
    

    【讨论】:

    • 请注意,select1st 不是 C++ 标准库的一部分。
    • 嗯。幸运的是,写起来很简单:template&lt;class T&gt; struct select1st : public unary_function&lt;T, typename T::first_type&gt; { const typename T::first_type&amp; operator()(const T&amp; x) const {return x.first;} };
    【解决方案3】:

    我真的很喜欢 James 的回答,但您可能还想考虑另一种选择 - 只需将所有内容汇集到 std::map

    std::map<std::string, bool> myMap(v.begin(), v.end());
    

    或者,如果你有重复的字符串,std::multimap:

    std::multimap<std::string, bool> myMultiMap(v.begin(), v.end());
    

    这确实有一个额外的优势,如果您随后需要添加或删除新的键/值对,您可以在 O(lg n) 中执行此操作,而不是排序向量的 O(n)。

    如果您真的必须使用向量,那么请使用 James 的答案。但是,如果您有一个成对向量,那么您很有可能真的想要一个 std::map

    【讨论】:

    • 我需要考虑用户不希望他们按他们给他们的顺序排序的情况。
    • 此外,向量 + 排序实际上可能比在(多)映射中插入大量内容要快得多,无论大 O 表示法是什么意思。
    【解决方案4】:

    回答“重复问题”: 链接:Sort a vector of pairs by first element then by second element of the pair in C++?

    bool cmp(const pair<int,int>&x,const pair<int,int>y){
    if(x.first==y.first){
       return(x.second<y.second);
    }
    return(x.first<y.first);
    }
    
    array of pairs before:
    5 2
    4 2
    8 2
    8 3
    8 1
    array of pairs after:
    4 2
    5 2
    8 1
    8 2
    8 3
    

    【讨论】:

      【解决方案5】:

      您不需要提供任何比较函数,因为默认情况下 sort() 函数将按值的升序对向量进行排序。由于每个元素都是一对,所以如果一对的第一个值小于另一对的第一个值,则一对将小于另一对。

      vector<pair<string,int>>v;
      v = {{"xyz",1},{"pq",2}};   // Sample input
      sort(v.begin(),v.end());    // Requires #include<algorithm> header
      

      【讨论】:

        猜你喜欢
        • 2011-10-29
        • 2020-09-07
        • 2013-02-08
        • 2010-09-19
        • 2013-08-18
        • 2011-01-01
        • 1970-01-01
        • 2010-10-15
        • 2016-10-22
        相关资源
        最近更新 更多