10

std::findコンテナーのfindメソッドよりもC++11 を使用する利点はありますか?

  • (メソッドstd::vectorを持たない)の場合、いくつかのスマートアルゴリズムまたはすべての要素を単純に反復する単純な方法を使用しますか?findstd::find

  • の場合、 のでstd::mapある を渡す必要があるようです。通常、キーまたはマップされた要素のいずれかを検索する必要があるため、これはあまり役に立ちません。std::pairvalue_typestd::map

  • std::listまたはstd::setまたはのような他のコンテナはどうstd::unordered_setですか?

4

1 に答える 1

15

std::vector (find メソッドを持たない) の場合、std::find はスマート アルゴリズムまたはすべての要素を単純に反復処理する単純な方法を使用しますか?

ベクトルはソートされていないため、できません。O(n) の複雑さを持つ線形検索以外に、並べ替えられていないベクトル内の要素を見つける方法はありません。

一方、シーケンス コンテナーはfind()メンバー関数を提供しないため、使用できない可能性があります。

std::map の場合、std::map の value_type である std::pair を渡す必要があるようです。通常、キーまたはマップされた要素のいずれかを検索する必要があるため、これはあまり役に立ちません。

実際、ここでfind()はより複雑な (O(log N)) を保証するメンバー関数を使用する必要があります。

一般に、コンテナーがジェネリック アルゴリズムと同じ名前のメンバー関数を公開する場合、これはメンバー関数が同じことを行うためですが、複雑さの保証はより優れています。

std::list または std::set または std::unordered_set のような他のコンテナはどうですか?

と同様std::vectorに、std::listはソートされたコンテナーではありません。したがって、同じ結論が適用されます。

std::setとのstd::unordered_set代わりに、find()より良い複雑さ (それぞれ O(log n) と平均 O(1)) を保証するメンバー関数を使用する必要があります。

于 2013-06-22T22:45:50.040 に答える