对地图进行排序<list <list <int>&gt;,int&gt;通过keyvalue的总和

时间:2016-02-17 04:42:31

标签: c++ maps

我有一个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

1 个答案:

答案 0 :(得分: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)
  }
};

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

此外,如果您同时拥有multimap{1,3}个密钥,则可能需要使用{2,2}

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