簡體   English   中英

比較 unordered_map 和 unordered_set

[英]Comparing unordered_map vs unordered_set

首先,它們之間的主要區別是什么?

我發現的唯一一件事是unordered_set沒有 operator [] 我應該如何訪問unordered_set的元素,因為沒有[]

哪個容器使用隨機訪問內存(或兩者)?

哪一個在任何意義上都更快或使用更少的內存?

它們幾乎相同。 unordered_set只包含鍵,沒有值。 沒有從鍵到值的映射,因此不需要operator[] unordered_map將鍵映射到值。

您可以使用unordered_set的各種find方法來定位事物。

您可以使用迭代器訪問元素。

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

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

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

我應該如何訪問 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM