未ソートのベクトルから重複を削除
未ソートのベクトルから重複を除去しながら、最初に出現した順序を維持することは、さまざまな状況で重要です。セットと手動反復を利用する単純なアプローチは効果的ですが、STL アルゴリズムを活用することで改善できます。
これを実現するには、std::copy_if アルゴリズムが便利なソリューションを提供します。すでに処理された要素を追跡し、重複に対して false を返す述語を定義することで、必要な要素を除外できます。
C 11 サポートが利用できない場合は、ぎこちない名前の std::remove_copy_if を使用できます。その論理は逆転した。以下に、テストされていない例を示します。
template <typename T> struct NotDuplicate { bool operator()(const T& element) { return s_.insert(element).second; // true if s_.insert(element); } private: std::set<T> s_; };
次に、次のコードを使用できます。
std::vector<int> uniqueNumbers; NotDuplicate<int> pred; std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(uniqueNumbers), std::ref(pred));
このソリューションでは、std::ref により、ステートフル ファンクターがアルゴリズム内で内部的にコピーされます。ただし、 std::copy_if は、適用されたファンクターの副作用に関する要件を課しません。
以上が順序を維持しながらソートされていないベクトルから重複を削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。