web-dev-qa-db-ja.com

unordered_mapとunordered_setの比較

まず、それらの主な違いは何ですか?

私が見つけた唯一のことは、unordered_setに演算子[]がないことです。 unordered_setがないため、[]の要素にどのようにアクセスする必要がありますか?

どのコンテナーがメモリ(またはその両方)へのランダムアクセスを使用していますか?

そして、それらのうちどれが何らかの意味でより高速であるか、またはより少ないメモリを使用していますか?

13
Welez

それらはほとんど同じです。 unordered_setにはキーのみが含まれ、値は含まれません。キーから値へのマッピングはないため、operator[]は必要ありません。 unordered_mapは、キーを値にマップします。

unordered_set内のさまざまなfindメソッドを使用して、物事を検索できます。

13

イテレータを使用して要素にアクセスできます。

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
Sachith Bathiya

unordered_set(C++ 17)の要素にアクセスするにはどうすればよいですか?

C++ 17では、新しい関数extractunordered_setに追加されています。特に、これはセットからオブジェクトのみを移動する唯一の方法です。

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

たとえば、順序なしセットの3番目の要素が必要な場合などです。イテレータを進める

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();
1
Pavan Chandaka