有没有办法在多图内联中查找键的数量?
Posted
技术标签:
【中文标题】有没有办法在多图内联中查找键的数量?【英文标题】:Is There a way to Find the Number of Keys in a multimap Inline? 【发布时间】:2017-12-20 14:33:31 【问题描述】:multimap
的 size
报告它包含的值的数量。我对它包含的键数感兴趣。例如,给定multimap<int, double> foo
,我希望能够做到这一点:
const auto keyCount = ???
一种方法是在零初始化的keyCount
上使用for
-循环:
for(auto it = cbegin(foo); foo != cend(foo); it = foo.upper_bound(foo->first)) ++keyCount;
但是,这不允许我执行内联操作。所以我无法初始化const auto keyCount
。
解决方案可以是包装此for
-loop 的 lambda 或函数,例如:
template <typename Key, typename Value>
size_t getKeyCount(const multimap<Key, Value>& arg)
size_t result = 0U;
for(auto it = cbegin(foo); foo != cend(foo); it = foo.upper_bound(foo->first)) ++result;
return result;
但我希望标准提供一些东西。有这种事吗?
【问题讨论】:
也许 std::multimap 不是最适合您的数据结构。例如std::map<key,std::vector<value>>
可以更好地工作。
包裹 for 循环的 const auto keyCount = std::accumulate(...
怎么样?
@Slava 遇到了vector
的vector
s 问题:***.com/q/38244435/2642059(虽然这可能仍然是我最好的选择,但我仍然希望得到这个问题的答案。)
@tobi303 我怀疑std::accumulate()
可以跳过唯一键
@tobi303 我要猛烈抨击那将需要我逐步检查multimap
中的所有元素,但我想我很确定upper_bound
正在这样做.我想就您的观点而言,我们可能也可以使用count_if
或for_each
来做到这一点:( 我假设这将是一个很好的答案,如果你输入我会接受。
【参考方案1】:
不,标准中没有内置的功能可以做到这一点。考虑到您的 count 函数有效,因为 multimap 是内部排序的。 libstdc++ 等典型实现使用红黑树作为内部表示。您需要遍历树才能计算所有(唯一)键。这是不可避免的。
【讨论】:
【参考方案2】:1st,multimap
天真地不包含密钥计数。所以你的问题是关于如何使用algorithm library 中的东西来查找计数。您设置的排除库中所有内容的 2 个约束是:
-
必须内联使用,因此必须返回计数,而不是迭代器
必须至少与 lambda 中使用的
upper_bound
一样好,它具有时间复杂度:O(log n)
1给我们留下:count
、count_if
、for_each
,以及numeric library中的大部分算法
2 无需考虑所有这些,因为它们中的每一个都有时间复杂度:O(n)
因此,您的getKeyCount
比标准提供的任何其他选项更可取。
只是对可能出现的另一个选项的评论:每当从foo
添加或删除某些内容时维护keyCount
,这似乎可行,但如果插入的密钥存在,则需要在每次插入之前检查,并在每次删除后检查删除的密钥是否仍然存在。除此之外,还有对多线程不可操作的危险和代码可读性损失的考虑,不清楚这个keyCount
必须和foo
一起维护。最终这是一个坏主意,除非密钥计数的获取频率明显高于 foo
的更新频率。
【讨论】:
【参考方案3】:如果您只是创建多映射并在其中插入值,则可以保留一个伴随映射来记录不同类型的键。该地图的大小将为您提供密钥数量。
【讨论】:
这可能应该是评论:(另请参阅此答案后半部分提出的问题:***.com/a/47928082/2642059以上是关于有没有办法在多图内联中查找键的数量?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将类型声明中特定键的值用作同一声明中另一个键的类型(在 Typescript 中)?