比较unordered_map和unordered_set

27

首先,它们之间的主要区别是什么?

我发现唯一的区别是unordered_set没有运算符[]。既然没有[],那么我该如何访问unordered_set中的元素呢?

哪个容器使用随机访问内存(或两者都使用)?

它们中哪一个在任何方面更快或使用更少的内存?


它们具有不同的目的,一个是地图,一个是集合。如果你需要地图,请使用地图。如果你需要集合,请使用集合。性能和内存并不是相关的区别。 - Mooing Duck
仅仅是为了补充1201ProgramAlarm所说的,无序集合(unordered_set)中的元素也是键。因此,用户提供的值既是元素又是键。 - Richard Han
3个回答

36

它们几乎相同。 unordered_set 仅包含键(key),没有值(value)。没有从键到值的映射,因此不需要使用 operator[] 操作符。 unordered_map 将一个键映射到一个值。

您可以在 unordered_set 中使用各种 find 方法来定位事物。


为什么它们不像 std::queue 和 std::deque 一样被创建。我的意思是,队列是双端队列的适配器。为什么 std::unordered set 不是 std::unordered map 的适配器呢? - Gusev Slava
3
集合要求其中的项目是不可变的,而映射具有可变键。因此,如果没有浪费内存的情况下,两者都无法彼此实现。 - Mooing Duck

2

您可以使用迭代器来访问元素。

unordered_set <string> u{
            "Dog",
            "Cat",
            "Rat",
            "Parrot",
            "bee"
};

for(auto& s:u){
     cout << s << ' ';    
} 

unordered_set<string>::const_iterator point = u.find("bee");

1

我应该如何访问unordered_set中的元素(C++17)?

C++ 17添加了一个新的函数extractunordered_set中。 特别地,这是唯一将移动对象从集合中取出的方法。

https://en.cppreference.com/w/cpp/container/unordered_set/extract

例如,如果您想获取无序集合中的第三个元素。请提升迭代器。
std::advance(it,2);

然后提取值。
s.extract(it).value();

以下是完整的代码。在任何C++17编译器上尝试。

#include <iostream>
#include <string>
#include <unordered_set>
#include <iterator>

int main()
{
    //CREATE AN OBJECT
    std::unordered_set<std::string> s;

    //INSERT DATA
    s.insert("aee");
    s.insert("bee");
    s.insert("cee");
    s.insert("dee");

    //NEED TO INCLUDE "iterator" HEADER TO USE "std::advance"
    auto it = s.begin();
    std::advance(it,2);

    //USING EXTRACT
    std::string sval = s.extract(it).value();
    std::cout<<sval;
}

注意:如果查询超出范围的索引,将不会发生任何事情。没有结果。 尝试更改您的代码。
 //ONLY FOUR ELEMENTS 
 std::advance(it,8);    
 //USING EXTRACT
 std::string sval = s.extract(it).value();

插入数据部分可以通过使用初始化列表(std::unordered_set<std::string> s{"aee", "bee", "cee", "dee"};)更简洁地完成。此外,还有std::next(it, 2) - L. F.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接