C で順序を維持しながら、ソートされていないベクトルから重複を削除するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-14 09:44:02
オリジナル
376 人が閲覧しました

How to Remove Duplicates from an Unsorted Vector while Preserving Order in C  ?

重複の削除で順序を維持する: 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));
ログイン後にコピー
このソリューションは効率的な方法を提供します。 STL アルゴリズムの多用途性を利用して、元の順序を維持しながら重複を削除するエレガントな方法も備えています。

以上がC で順序を維持しながら、ソートされていないベクトルから重複を削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート