在 unordered_multimap 中准确地迭代每个键一次的有效方法
Posted
技术标签:
【中文标题】在 unordered_multimap 中准确地迭代每个键一次的有效方法【英文标题】:Efficient way to iterate over each key exactly once in unordered_multimap 【发布时间】:2020-01-04 09:53:12 【问题描述】:我有一个std::unordered_multimap
,我想对每个键只迭代一次。
我目前正在做的是将所有密钥复制到std::set
。这对我来说似乎效率很低,我想知道是否有更聪明的方法来做到这一点。如果是std::multiset
我会使用std::multiset::upper_bound()
成员来访问下一个键,但是这个成员显然在无序版本中不可用。
我找到了一些相关的问题和答案,但对于我的目的来说,它们似乎已经过时/过于复杂。
那么有没有一种遍历不同键的好方法?我仍在学习,因此将我指向正确的方向也将不胜感激!谢谢。
【问题讨论】:
遍历每个键,您的意思是按顺序,不是吗?否则,您可以直接遍历std::unordered_multimap
。
您可以使用为键参数化的std::unordered_set
轻松跟踪重复键:对于每次迭代,您检查该键是否已经在std::unordered_set
中。如果是这样,则跳过当前元素。否则,您处理此元素并将此元素的键插入std::unordered_set
。但是,如果必须按顺序遍历键,则需要另一种方法。
抱歉,英语不是我的第一语言,'std::unordered_set
参数化键'是什么意思?我在谷歌上找不到任何关于它的信息。这是否意味着您将每个键添加到std::unordered_set
?这是有道理的,但似乎仍然效率低下。
真的需要按顺序排列吗?鉴于c++ reference 中的实现提示,除了您的建议外,我看不到按顺序遍历键的方法。另一种选择是按照建议以随机顺序遍历所有键并存储您在 unordered_set 中已经看到的键的信息。对于每次迭代,您检查它们的键是否存在于集合中。如果不进行计算并将其添加到集合中。否则跳过密钥。
如果需要订单,为什么要使用 unordered
【参考方案1】:
[...] 具有等效键的元素在容器的迭代顺序中彼此相邻。
Source,或者你可以认为这是由equal_range
的存在保证的。请注意,“等效”位于KeyEqual
下,即如果指定了默认std::equal_to<Key>
,则表示==
。
所以按元素迭代,跳过具有相同键的元素,将起作用:
for (auto it = c.begin(); it != c.end(); )
auto const& key = it->first;
std::cout << key << std::endl;
while (++it != c.end() && it->first == key) // or c.key_eq()
;
【讨论】:
以上是关于在 unordered_multimap 中准确地迭代每个键一次的有效方法的主要内容,如果未能解决你的问题,请参考以下文章
保证 std::unordered_multimap 中的键唯一性
如何拥有 unordered_multimaps 的 unordered_multimap
如何在 C++ 中在 int 和 pair 之间制作 unordered_multimap?
从 unordered_multimap 中调用另一个类的函数?