web-dev-qa-db-ja.com

std :: setとベクターまたはマップの利点

これはばかげた質問かもしれませんが、私はC++とプログラミング全般にはまったく不慣れです。いくつかのSTLコンテナの使用を理解したいのですが、それを念頭に置いて、std :: setを使用した場合と、たとえばベクトルやマップを使用した場合の利点は何だと思いましたか?この質問に対する明確な答えを見つけることができないようです。セットがマップを使用していることに気付きましたが、なぜマップを常に使用しないか、常にセットを使用しないのでしょうか。代わりに、2つの非常に類似したコンテナーが提供されます。前もって感謝します。

39
brunodd

両方 std::setおよびstd::mapは連想コンテナです。違いは、std::setsにはキーのみが含まれますが、std::map関連する値があります。どちらを選択するかは、主に手元のタスクに依存します。テキストに表示されるすべての単語の辞書を作成する場合は、std::set<std::string>、ただし、各Wordの出現回数もカウントする場合(つまり、値をキーに関連付ける場合)、std::map<std::string,int>。そのカウントを関連付ける必要がない場合、不要なintを使用しても意味がありません。

セットは、「typeOfFruits」の列挙などの一意のものを格納するのに役立ちます

std::set<typeOfFruits> fruits;   
fruits.insert (banana);
fruits.insert (Apple);
fruits.insert (pineapple);

//it's fast to know if my store sells a type of fruit.
if (fruits.find (pear) == fruits.end())
{ std::cout<<"i don't have pear"; }

マップはユニークなものと「値」を保存するのに便利です

std::map<typeOfFruits, double /*unit price*/> fruits;  
fruits[banana] = 1.05;
fruits[Apple] = 0.85;
fruits[pineapple] = 3.05;
//repeating pineapple will replace the old price (value)
fruits[pineapple] = 3.35;

//it's fast to know how much a fruit costs.
std::map<typeOfFruits, double /*unit price*/> itr = fruits.find(pineapple);
if (itr != fruits.end())
{ std::cout<<"pineapples costs: $" <<itr->second; }

ベクトルは、シーケンスが順序付けられているものを格納するのに役立ちます(Push_back())。チェックアウトで果物をスキャンし、プログラムがこのスキャンを追跡しているとします。

std::vector<typeOfFruits> fruits;
fruits.Push_back(Apple);
fruits.Push_back(Apple); 
fruits.Push_back(Apple);
fruits.Push_back(banana);
fruits.Push_back(banana);
fruits.Push_back(pineapple);
//i scanned 3 apples, 2 bananas and 1 pineapple.
24
Angel Koh
  • vectorは、コンテナの背面での挿入および削除が高速です。演算子[]を介して要素にアクセスできます。
  • dequeuevectorに似ていますが、前面の挿入と削除が特徴です。
  • setにはキーのみがあり、mapにはpairがあります。これらのコンテナは両方とも、コンテナの中央での挿入と削除が高速です。 STLアルゴリズムを使用して、find経由で要素にアクセスすることもできます。
4
lucas92

std::setは実際には不変です。その中の要素の値を変更しないでください。 std::setは変更を追跡しません。そのため、その中の要素を編集すると、その背後に戻り、内部の順序を変更する可能性があります。これは危険な動作です。したがって、std::mapエレメントをコンテナに入れた後にエレメントを編集する場合。必ずkeyを使用して順序付けを行い、後でvalueに変更する必要があるすべてのものを誘導してください。

3
user2554481

挿入、削除、検索などに関して、アプリケーションに最も望まれる複雑さの保証に帰着します。Scott Meyers 'Effective STLを強くお勧めします。

2
Scott Jones