【发布时间】: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
标签: c++ multimap c++20 unordered-multimap