请帮我按值计数对多图进行排序。
例如,
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
之前。
答案 0 :(得分:5)
这是不可能的。
除非你继续创建一个自定义结构,否则你需要一个结构来跟踪所有项目(这里是对),还有一个实际计算它们。
实际选择主要取决于排序操作是一次性计算还是实际需要保持同步。
如果是一次性计算,那么只需在需要时计算并完成计算。
如果您需要维护此顺序,那么我建议您阅读Boost.MultiIndex并将其用作开发自定义类的基础。
答案 1 :(得分:1)
这是不可能的。比较器具有以下限制:当比较两件事时,它们总是一致地比较。例如:如果'a'小于'b',则必须始终为真。
在您的比较器中,您违反了此规则,因为向多重映射添加更多“a”或“b”可能会突然导致比较结果发生变化。
multimap使用比较器来组织它在内存中存储元素的方式。如果两个元素可以比较一种方式然后突然以不同的方式比较,则多图中元素的整个组织将不得不改变。如果只插入一个新元素,则不会实现multimap重新排列所有现有内容,因为这样做效率很低。