Maison > développement back-end > C++ > Comment supprimer les doublons d'un vecteur non trié tout en préservant l'ordre en C ?

Comment supprimer les doublons d'un vecteur non trié tout en préservant l'ordre en C ?

Mary-Kate Olsen
Libérer: 2024-11-14 09:44:02
original
486 Les gens l'ont consulté

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

Conserver l'ordre dans la suppression des doublons : les algorithmes STL à la rescousse

Lorsqu'il s'agit de vecteurs non triés, la tâche de supprimer les doublons tout en préservant le la commande originale peut être intimidante. Bien que les méthodes de force brute telles que l'utilisation d'un ensemble pour suivre des éléments uniques soient viables, explorons une solution plus élégante utilisant des algorithmes STL.

Un algorithme puissant en STL est std::copy_if. Il faut un prédicat pour filtrer les éléments, en copiant ceux qui correspondent aux critères dans un nouveau conteneur. Pour l'appliquer ici, nous définissons un prédicat NotDuplicate qui maintient un ensemble d'éléments traités et est évalué à false si un élément a déjà été rencontré.

Voici une implémentation simplifiée du NotDuplicate prédicat :

struct NotDuplicate {
  bool operator()(const int& element) {
    return s_.insert(element).second;
  }
 private:
  std::set<int> s_;
};
Copier après la connexion

Avec ce prédicat en main, nous pouvons employer std::copy_if pour atteindre notre objectif :

std::vector<int> uniqueNumbers;
NotDuplicate<int> pred;
std::copy_if(numbers.begin(), numbers.end(), 
             std::back_inserter(uniqueNumbers),
             std::ref(pred));
Copier après la connexion

Ce code parcourt le vecteur d'origine, filtrant les éléments à l'aide du prédicat NotDuplicate. Les éléments qui n'ont pas été rencontrés auparavant sont copiés dans le vecteur uniqueNumbers, en préservant l'ordre d'origine.

Pour ceux qui ne prennent pas en charge C 11, une approche alternative implique std::remove_copy_if, qui fait l'inverse de std::copy_if. Vous inverseriez la logique du prédicat (par exemple, renverriez vrai si un élément a été rencontré) et utiliseriez std::remove_copy_if pour supprimer les doublons :

std::vector<int> uniqueNumbers;
NotDuplicate<int> pred;
std::remove_copy_if(numbers.begin(), numbers.end(), 
             std::back_inserter(uniqueNumbers),
             std::ref(pred));
Copier après la connexion

Cette solution offre un et élégante manière de supprimer les doublons tout en conservant l'ordre d'origine, en profitant de la polyvalence des algorithmes STL.

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal