按计数对多映射进行排序

Sort multimap by count

本文关键字:排序 映射      更新时间:2023-10-16

请帮我按值计数对多映射进行排序。

例如

multimap<char,int> mymultimap;
mymultimap.insert (pair<char,int>('a',100));
mymultimap.insert (pair<char,int>('a',101));
mymultimap.insert (pair<char,int>('a',111));
mymultimap.insert (pair<char,int>('b',200));
mymultimap.insert (pair<char,int>('b',211));
mymultimap.insert (pair<char,int>('c',300));

应按以下顺序排序后:

c
b
a

我尝试像这样使用自定义比较器:

struct comparer
{
    bool operator() (const char& first, const char& second) const
    {
        return mymultimap.count(first) < mymultimap.count(second);
    }
};

但我无法定义

multimap<char, int, comparer> mymultimap;

在定义struct comparer之前。

是不可能的。

除非您继续创建自定义结构,否则您似乎需要一个结构来跟踪所有项目(此处为对),并且需要一个结构来实际计算它们。

实际

选择主要取决于排序操作是一次性计算,还是实际需要保持两者同步。

如果它是一次性计算,那么只需在需要时计数并完成它。

如果你需要保持这个顺序,那么我建议阅读Boost.MultiIndex,并将其用作开发自定义类的基础。

是不可能的。比较器有一个限制,即当比较两件事时,它们总是一致地进行比较。例如:如果"a"小于"b",则必须始终为真。

在比较器中,您违反了此规则,因为向多重映射添加更多"a"或"b"可能会突然导致比较结果发生变化。

多重映射使用比较器来组织其在内存中存储元素的方式。如果两个元素可以以一种方式比较,然后突然以不同的方式进行比较,那么多重映射中元素的整个组织将不得不改变。当您只插入一个新元素时,不会实现 multimap 来重新排列其所有现有内容,因为这样做效率非常低。