我有一个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
答案 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}
。
最后一点 - 地图在插入时排序(和重新平衡等)。如果要排序一次,可以使用向量并在填充后调用一次。比较器将是相同的。