【问题标题】:How to sort a list of pairs based on second element in decreasing order in c++如何在c ++中按降序对基于第二个元素的对列表进行排序
【发布时间】:2020-05-18 22:07:09
【问题描述】:

我想知道是否有办法根据第二个元素对我的配对列表进行排序。这是一个代码:

std::list<std::pair<std::string, unsigned int>> words;

words.push_back(std::make_pair("aba", 23);
words.push_back(std::make_pair("ab", 20);
words.push_back(std::make_pair("aBa", 15);
words.push_back(std::make_pair("acC", 8);
words.push_back(std::make_pair("aaa", 23);

我想根据整数元素按降序对列表单词进行排序,这样我的列表将如下所示:

<"aba", 23>,<"aaa", 23>,<"ab", 20>,<"aBa", 15>,<"acC", 8>

此外,是否可以同时按第一个和第二个元素对它们进行排序,以便它首先按第二个元素排序(按整数值),然后如果有两个或多个对具有相同的第二个元素(即相同的整数value),然后它会根据第一个元素按字母顺序对它们进行排序,然后我上面排序列表中的前 2 对将交换,所以:

<"aaa", 23>,<"aba", 23>,<"ab", 20>,<"aBa", 15>,<"acC", 8>

【问题讨论】:

标签: c++ list sorting stl containers


【解决方案1】:

std::list 有一个成员函数 std::list::sort 应该进行排序。

它的两个重载之一接受自定义比较函数:

template <class Compare>
void sort(Compare comp);

你可以按如下方式使用:

words.sort([](const std::pair<string, unsigned int> &x,
              const std::pair<string, unsigned int> &y)
{
    return x.second > y.second;
});

【讨论】:

    【解决方案2】:

    我想根据整数元素以降序

    对我的list字词进行排序

    如果传递的第一个元素(即第一对)在您建立的顺序中位于第二个元素之前,则排序谓词必须返回 true

    words.sort([](auto const& a, auto const& b) {
          return a.second > b.second;
    });
    

    由于您希望按降序对列表进行排序,如果a 对的第二个元素(即int)大于b',则其将位于b 之前。第二个元素。


    请注意,std::sort() 不适用于对std::list 进行排序,因为它需要随机访问迭代器,但std::list 仅提供双向迭代器


    是否可以同时按第一个和第二个元素对它们进行排序,以便它首先按第二个元素排序(按整数值),然后如果有两个或多个对具有相同的第二个元素(即相同的整数值) ,然后它会根据字母顺序对第一个元素进行排序

    再次假设int 元素的降序,当两个int 元素相同时,只需使用对的第二个元素:

       lst.sort([](auto const& a, auto const& b) {
          if (a.second > b.second)
             return true;
          if (a.second < b.second)
             return false;
          return a.first < b.first;
       });
    

    感谢std::tie(),或更简洁:

    lst.sort([](auto const& a, auto const& b) {
        return std::tie(b.second, a.first) < std::tie(a.second, a.first);
     });
    

    【讨论】:

    • 对不起,我对编程很陌生。所以在我的头文件中,我是否将 bool sortbysecond([](auto const& a, auto const& b) { return std::tie(b.second, a.first)
    • @LilithX 你用它作为words.sort(...)。它是std::list成员函数。但是,您也可以使用 std::sort() 的谓词对 std::vector 进行排序。
    • 如果你想写一个函数而不是一个 lambda,那就是bool sortbysecond(const std::pair&lt;string, unsigned int&gt; &amp;a, const std::pair&lt;string, unsigned int&gt; &amp;b) { return std::tie(b.second, a.first) &lt; std::tie(a.second, a.first); }
    • 啊!它编译成功!您是否碰巧知道我如何遍历我的排序列表,以便我可以将它们打印出来并查看它们是否确实排序正确?非常感谢!
    • 确实如此!非常感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2022-02-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 2016-10-18
    • 1970-01-01
    相关资源
    最近更新 更多