【问题标题】:Comparing unordered_map vs unordered_set比较 unordered_map 与 unordered_set
【发布时间】:2017-03-12 06:05:28
【问题描述】:

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

我发现的唯一一件事是unordered_set 没有运算符[]。 我应该如何访问unordered_set 中的元素,因为没有[]

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

从某种意义上说,哪一个更快或使用更少的内存?

【问题讨论】:

  • 满足不同的目的,一个是地图,一个是集合。如果您需要地图,请使用地图。如果您需要一套,请使用该套。性能和内存不是相关的差异。
  • 只是把1201ProgramAlarm所说的加起来,unordered_set中的元素也是键。所以用户提供的值同时是元素和键。

标签: c++ algorithm c++11 data-structures time-complexity


【解决方案1】:

它们几乎相同。 unordered_set 只包含键,没有值。没有从键到值的映射,因此不需要operator[]unordered_map 将键映射到值。

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

【讨论】:

  • 为什么它们不像 std::queue 和 std::deque 那样创建。我的意思是队列是双端队列的适配器。为什么 unordered_set 不是 std::unordered map 的适配器?
  • @GusevSlava:集合要求项目是不可变的,并且地图具有可变键。因此,任何一个都不能由另一个实现而不浪费内存。
【解决方案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");

【讨论】:

    【解决方案3】:

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

    在 C++ 17 中,一个新函数 extract 被添加到 unordered_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&lt;std::string&gt; s{"aee", "bee", "cee", "dee"};) 更简洁地完成。还有std::next(it, 2).
    猜你喜欢
    • 2018-12-17
    • 2015-09-10
    • 2020-08-12
    • 2016-07-03
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    • 2011-12-01
    相关资源
    最近更新 更多