1. ホーム
  2. c++

std::setとstd::vectorの違いは何ですか?

2023-08-17 07:04:54

質問

私は今STLを学んでいます。私は set コンテナについて読みました。私はあなたが使用したいときに質問があります set ? 読み終わった後 セットの説明 で代用できるため、無駄なようです。 vector . の長所と短所を教えてください。 vectorset のコンテナです。ありがとうございます。

どのように解決するのですか?

A set は順序があります。それは 保証 であり、あなたが提供するファンクタに従って、特定の順序を保つことが保証されています。どのような要素を追加したり削除したりしても(重複を追加しない限り、 これは set では許されない重複を加えない限り)、常に順序が保たれます。

A vector は、まさに だけ を持つ。の項目は vector にある項目は、あなたが置いた場所にあります。もし順番を無視して入れたのなら、それは順番が狂っていることになります。 sort をクリックして、順序を元に戻してください。

認める。 set は比較的限られた用途しか持ちません。適切な規律があれば、項目を vector にアイテムを挿入し、それを秩序立てておくことができます。しかし、常にコンテナにアイテムを挿入したり取り出したりするのであれば vector は多くの問題に直面することになります。それは事実上単なる配列であるため、要素のコピー/移動などを大量に行うことになります。

に項目を挿入するのにかかる時間は、1時間未満です。 vector に挿入するのにかかる時間は、既にあるアイテムの数に比例します。 vector . にアイテムを挿入するのにかかる時間は、そのアイテムの数に比例します。 set log₂ に比例します。項目数が多ければ、それは大きな違いです。log₂(10万)は~16で、これは大きな速度改善です。削除も同様です。

しかし、挿入をすべて一度に、初期化時に行うのであれば、問題はないでしょう。すべてを挿入して vector に挿入し、それをソートし (その代償を一度支払うことになります)、そしてソートされた vectors の標準的なアルゴリズムを使って要素を見つけ、ソートされたリストを反復処理します。そして set の要素に対する繰り返しは必ずしも遅くはありませんが vector を反復する方が速いです。

ということは、ソートされた vector に勝るとも劣らない set . とはいえ、この種の最適化が必要だとわかっていない限り、わざわざ費用をかける必要はないでしょう。ですから set が必要だとわかるようなプロファイリングデータが手元にない限りは、 を使ってください。 vector ではなく set .