これはばかげた質問かもしれませんが、私はC++とプログラミング全般にはまったく不慣れです。いくつかのSTLコンテナの使用を理解したいのですが、それを念頭に置いて、std :: setを使用した場合と、たとえばベクトルやマップを使用した場合の利点は何だと思いましたか?この質問に対する明確な答えを見つけることができないようです。セットがマップを使用していることに気付きましたが、なぜマップを常に使用しないか、常にセットを使用しないのでしょうか。代わりに、2つの非常に類似したコンテナーが提供されます。前もって感謝します。
両方 std::set
およびstd::map
は連想コンテナです。違いは、std::set
sにはキーのみが含まれますが、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.
vector
は、コンテナの背面での挿入および削除が高速です。演算子[]を介して要素にアクセスできます。dequeue
はvector
に似ていますが、前面の挿入と削除が特徴です。set
にはキーのみがあり、map
にはpair
があります。これらのコンテナは両方とも、コンテナの中央での挿入と削除が高速です。 STLアルゴリズムを使用して、find経由で要素にアクセスすることもできます。std::set
は実際には不変です。その中の要素の値を変更しないでください。 std::set
は変更を追跡しません。そのため、その中の要素を編集すると、その背後に戻り、内部の順序を変更する可能性があります。これは危険な動作です。したがって、std::map
エレメントをコンテナに入れた後にエレメントを編集する場合。必ずkey
を使用して順序付けを行い、後でvalue
に変更する必要があるすべてのものを誘導してください。
挿入、削除、検索などに関して、アプリケーションに最も望まれる複雑さの保証に帰着します。Scott Meyers 'Effective STLを強くお勧めします。