重複の削除で順序を維持する: STL アルゴリズムを救済する
ソートされていないベクトルを扱う場合、重複を削除しながら重複を削除するタスクオリジナルの注文は気が遠くなるかもしれません。セットを使用して一意の要素を追跡するような強引な方法も実行可能ですが、STL アルゴリズムを利用したより洗練されたソリューションを検討してみましょう。
STL の強力なアルゴリズムの 1 つが std::copy_if です。要素をフィルタリングするには述語を使用し、条件に一致する要素を新しいコンテナにコピーします。これをここに適用するには、処理された要素のセットを保持し、要素が以前に検出された場合に false と評価する NotDuplicate 述語を定義します。
これは の簡略化された実装です。 NotDuplicate 述語:
struct NotDuplicate { bool operator()(const int& element) { return s_.insert(element).second; } private: std::set<int> s_; };
この述語を使用std::copy_if を使用して目標を達成できます。
std::vector<int> uniqueNumbers; NotDuplicate<int> pred; std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(uniqueNumbers), std::ref(pred));
このコードは、元のベクトルを反復処理し、NotDuplicate 述語を使用して要素をフィルタリングします。これまでに出現したことのない要素は、元の順序を維持して uniqueNumbers ベクトルにコピーされます。
C 11 サポートがない要素 については、代替アプローチとして std::remove_copy_if、これは逆の処理を行います。 std::copy_if。述語のロジックを反転し (たとえば、要素が見つかった場合に true を返す)、std::remove_copy_if を使用して重複を削除します。
std::vector<int> uniqueNumbers; NotDuplicate<int> pred; std::remove_copy_if(numbers.begin(), numbers.end(), std::back_inserter(uniqueNumbers), std::ref(pred));
以上がC で順序を維持しながら、ソートされていないベクトルから重複を削除する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。