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
Mary-Kate Olsenoriginal
2024-11-14 09:44:02451parcourir

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_;
};

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));

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));

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:
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