Maison  >  Article  >  développement back-end  >  Comment supprimer les doublons d'un tableau non trié tout en conservant l'ordre d'insertion à l'aide des algorithmes STL ?

Comment supprimer les doublons d'un tableau non trié tout en conservant l'ordre d'insertion à l'aide des algorithmes STL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-11 19:02:03500parcourir

How to Remove Duplicates from an Unsorted Array While Maintaining Insertion Order Using STL Algorithms?

Algorithmes STL pour la suppression des doublons avec préservation de la commande

Étant donné un tableau d'entiers non triés, la tâche consiste à supprimer les éléments en double tout en préservant l'insertion ordre de la première occurrence de chaque entier. Bien qu'une approche simple utilisant un ensemble puisse y parvenir, une solution optimisée tirant parti des algorithmes STL offre une solution plus efficace et plus élégante.

Approche basée sur l'algorithme STL

STL fournit plusieurs algorithmes qui facilitent une manipulation efficace des conteneurs. Un de ces algorithmes est std::copy_if. Cet algorithme peut être utilisé pour créer un nouveau vecteur contenant des éléments uniques tout en conservant leur ordre d'origine.

Pour implémenter cette solution, définissez une fonction de prédicat qui garde la trace des éléments précédemment rencontrés et renvoie false si un élément a déjà été traité. Cela garantit que seuls les éléments uniques sont copiés dans le nouveau vecteur.

Implémentation

En C 11 et versions ultérieures, définissez un objet fonction avec un opérateur surchargé() qui implémente le prédicat :

template <typename T>
struct NotDuplicate {
  bool operator()(const T& element) {
    return s_.insert(element).second;  // true if element is unique
  }

private:
  std::set<T> s_;
};

Transmettez ce prédicat à std::copy_if avec les vecteurs d'origine et cible :

std::vector<int> uniqueNumbers;
NotDuplicate<int> pred;
std::copy_if(numbers.begin(), numbers.end(),
             std::back_inserter(uniqueNumbers),
             std::ref(pred));

Si le support C 11 n'est pas disponible, utilisez std::remove_copy_if et inversez la logique des prédicats pour obtenir le même résultat.

Conclusion

Cette approche démontre l'efficacité des algorithmes STL pour manipuler efficacement les conteneurs tout en garantissant le respect des exigences de commande souhaitées. . En tirant parti de l'algorithme std::copy_if, vous pouvez supprimer les doublons d'un vecteur non trié tout en préservant l'ordre d'insertion des éléments uniques.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn