【问题标题】:Iterate over all elements with key k in a std::unordered_multimap in O(count(k))在 O(count(k)) 中迭代 std::unordered_multimap 中具有键 k 的所有元素
【发布时间】:2023-01-14 22:30:40
【问题描述】:

我有一个std::unordered_multimap,我想用给定的键 k 遍历所有元素,而不遍历整个地图,但最好只遍历匹配的项目。

虽然我可以在有序的 std::multimap 中使用 upper_bound 执行此操作,但我无法找到 find() 后跟前向迭代直到键不同,将遍历键 k 的所有出现的规范,因为 find(k) 只能保证使用键k返回任意项目

编辑:我知道在我的具体情况下,我可以使用 std::unordered_map<Key, std::vector> 代替,它将满足我的所有需求。这个问题更多是出于好奇。

或者我错过了什么?

我的来源是: https://en.cppreference.com/w/cpp/container/unordered_multimap/find

【问题讨论】:

  • 也许你错过了equal_range
  • 虽然这是最坏的情况 O(N) 其中 N 是地图的大小
  • @463035818_is_not_a_number 最坏的情况是每个元素的哈希值相同,我不知道可以解决这种情况的哈希结构的任何实现

标签: c++ stl containers unordered-multimap


【解决方案1】:

来自 cppreferenceunordered_map::equal_range 示例:

#include <iostream>
#include <unordered_map>
 
int main()
{  
    std::unordered_multimap<int,char> map = {{1,'a'},{1,'b'},{1,'d'},{2,'b'}};
    auto range = map.equal_range(1);
    for (auto it = range.first; it != range.second; ++it) {
        std::cout << it->first << ' ' << it->second << '
';
    }
}

输出:

1 a
1 b
1 d

复杂度是

平均情况与具有键 key 的元素数量成线性关系,最坏情况与容器大小成线性关系。

请注意,复杂性在于获取迭代器。一旦你得到它们,循环就是所需的O(count(k))

【讨论】:

    猜你喜欢
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2012-06-27
    • 2018-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多