multimap
的{{1}}报告其包含的值的数量。我对它包含的键数感兴趣。例如,给定size
我希望能够这样做:
multimap<int, double> foo
获得此功能的一种方法是在零初始化const auto keyCount = ???
上使用for
- 循环:
keyCount
然而,这不允许我进行内联操作。所以我无法初始化for(auto it = cbegin(foo); foo != cend(foo); it = foo.upper_bound(foo->first)) ++keyCount;
。
解决方案可以是lambda或函数,它包含此const auto keyCount
循环,例如:
for
但我希望标准提供的东西。这样的事情存在吗?
答案 0 :(得分:0)
不,标准中没有内置功能。考虑您的计数功能是有效的,因为多图在内部排序。 libstdc ++等典型实现使用红黑树作为内部表示。您需要走树才能计算所有(唯一)键。这是不可避免的。
答案 1 :(得分:0)
1 st ,multimap
天真地不包含密钥计数。因此,您的问题是如何使用algorithm library中的某些内容来查找计数。您放置的2个限制因素排除了库中的所有内容:
upper_bound
一样好,后者具有时间复杂度: O(log n) 1 给我们留下:count
,count_if
,for_each
以及numeric library
2 消除了对所有这些问题的考虑,因为它们都具有时间复杂性: O(n)
因此,getKeyCount
优于标准提供的任何其他选项。
只是对可能出现的另一个选项的评论:keyCount
在foo
添加或删除某些内容时的维护,这似乎是可行的,但如果是每次插入,则需要检查插入密钥存在,如果删除的密钥仍然存在,则在每次删除后进行检查。除此之外,还考虑到多线程不可操作性的危险以及代码可读性的丧失,并且不清楚这个keyCount
是否必须与foo
一起保持。最终这是一个坏主意,除非更新密钥计数的频率明显高于foo
。
答案 2 :(得分:0)
如果仅创建多图并在其中插入值,则可以保留一个伴随图来记录不同类型的键。该地图的大小将为您提供密钥计数。