0

重複の可能性:
C++ はベクター内の重複エントリを削除します

C++ STL ベクトルの二重エントリを削除する必要があります。重要な点は、結果のベクトルの要素の順序が入力ベクトルの順序と同じでなければならないということです。これを行うアルゴリズム(stl、boostなど)はありますか?

4

4 に答える 4

5

ここには 2 つのケースが考えられます: ベクトルが既にソートされているか、ソートされていないかのいずれかです。

そうであれば、他の回答に示されているように、これstd::erasestd::unique簡単に解決できます。

そうでない場合は、次の方法で目標を達成できます

v.erase(std::remove_if(v.begin(), v.end(), predicate), v.end());

しかし、指定するのは簡単ではないという問題がありpredicateます。これは、1 つの引数 (考慮する値) を受け入れる関数であり、「ベクトルの前に等しい値はありますか?」という質問に答える必要があります。提供された引数がベクトル内の正確な場所にあるとは知らされていないため、これに答えるにはかなりの量の手動状態を維持する必要があります。

ここでの便利なオプションは、 を使用しstd::setて面倒な作業を行うことです。

std::set<decltype(v)::value_type> set(v.begin(), v.end());
v.erase(
    std::remove_if(
        v.begin(), 
        v.end(), 
        [&set] (decltype(v)::value_type item) { return !set.erase(item); }), 
    v.end());

これが行うことは、 にベクター内の値を事前入力しstd::set、アイテムがセットから削除されたかどうかを確認して、アイテムが以前に表示されたかどうかを確認することです。このようにして、結果は、入力で等しいと比較されるアイテムの各セットから最初のアイテムのみを保持します。

実際に見てください

于 2012-11-09T09:36:28.347 に答える
1

どうstd::uniqueですか?

auto firstDup = std::unique(myvector.begin(), myvector.end());
于 2012-11-09T09:10:07.153 に答える
-1

次を使用:
vec.erase( unique( vec.begin(), vec.end() ), vec.end() );

于 2012-11-09T09:08:17.713 に答える