Suppression des doublons d'un vecteur non trié
Maintenir l'ordre des premières occurrences tout en éliminant les doublons d'un vecteur non trié est crucial dans diverses situations. Bien qu'une approche simple utilisant une itération définie et manuelle soit efficace, elle peut être améliorée en tirant parti des algorithmes STL.
Pour y parvenir, l'algorithme std::copy_if fournit une solution pratique. En définissant un prédicat qui garde la trace des éléments déjà traités et renvoie false pour les doublons, nous pouvons filtrer les éléments souhaités.
Si la prise en charge de C 11 n'est pas disponible, le nom maladroit std::remove_copy_if peut être utilisé, avec sa logique est inversée. Voici un exemple non testé pour illustrer :
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_; };
Ensuite, le code suivant peut être utilisé :
std::vector<int> uniqueNumbers; NotDuplicate<int> pred; std::copy_if(numbers.begin(), numbers.end(), std::back_inserter(uniqueNumbers), std::ref(pred));
Dans cette solution, le std::ref garantit que le foncteur avec état n'est pas copié en interne dans l’algorithme. Cependant, std::copy_if n'impose aucune exigence sur les effets secondaires du foncteur appliqué.
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!