<int>按键值总和对映射<列表<列表>,int> 进行排序

Sorting a map<list<list<int>>,int> by sum of keyvalue

本文关键字:gt lt 列表 int 排序 键值 映射      更新时间:2023-10-16

>我有一个map<list<list<int>>,int>,我希望根据列表中元素的总和按C++降序对地图进行排序。例如,如果最初我的地图内容如下所示:-

{1,0}->38
{1,19}->1
{1,21}->1
{2,0}->5
{2,12}->1

最后我想要达到的结果是

{1,0}->38
{2,0}->5
{2,12}->1
{1,19}->1
{1,21}->1

你描述的看起来像一个list<int>.不list<list<int>>

您可以为映射指定一个比较器类,该类将根据需要定义元素的顺序。

在您的情况下:

map< list<int>, int, list_cmp >;
struct list_cmp {
  bool operator() ( const list<int>& lhs, const list<int>& rhs ) {
    // using > instead of < to get descending order
    return std::accumulate(lhs.begin(),lhs.end(),0) > std::accumulate(rhs.begin(),rhs.end(),0)
  }
};

这显然是次优的。您应该考虑缓存总和。您可以使用 sum 成员将list<int>包装在您自己的类中。

此外,如果可以同时拥有 {1,3} 键和{2,2}键,则可能需要使用 multimap

最后一点 - 地图在插入时进行排序(和重新平衡等(。如果要排序一次,可以使用向量并在填充后调用排序一次。比较器将是相同的。