按计数对多图表进行排序

时间:2012-05-24 10:56:00

标签: c++ sorting multimap

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

例如,

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之前。

2 个答案:

答案 0 :(得分:5)

这是不可能的。

除非你继续创建一个自定义结构,否则你需要一个结构来跟踪所有项目(这里是对),还有一个实际计算它们。

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

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

如果您需要维护此顺序,那么我建议您阅读Boost.MultiIndex并将其用作开发自定义类的基础。

答案 1 :(得分:1)

这是不可能的。比较器具有以下限制:当比较两件事时,它们总是一致地比较。例如:如果'a'小于'b',则必须始终为真。

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

multimap使用比较器来组织它在内存中存储元素的方式。如果两个元素可以比较一种方式然后突然以不同的方式比较,则多图中元素的整个组织将不得不改变。如果只插入一个新元素,则不会实现multimap重新排列所有现有内容,因为这样做效率很低。