2

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

例如,

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

4

2 回答 2

5

这是不可能的。

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

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

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

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

于 2012-05-24T11:20:27.493 回答
1

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

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

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

于 2012-05-24T11:36:30.450 回答