Maison >développement back-end >C++ >Comment puis-je supprimer efficacement les doublons et trier un vecteur C ?

Comment puis-je supprimer efficacement les doublons et trier un vecteur C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-20 20:24:10172parcourir

How Can I Efficiently Remove Duplicates and Sort a C   Vector?

Optimisation de l'effacement et du tri des doublons dans un vecteur

En C, les vecteurs sont une structure de données courante pour stocker des éléments. Cependant, gérer efficacement des vecteurs volumineux avec des doublons et des exigences de tri peut s'avérer difficile.

Approche inefficace

L'extrait de code fournissait des tentatives pour effacer les doublons et trier un vecteur à l'aide de std : :unique et std::sort:

vec.erase(
  std::unique(vec.begin(), vec.end()),
  vec.end());
std::sort(vec.begin(), vec.end());

Cependant, cette approche ne parvient pas à supprimer les doublons correctement.

Approche préférée

Il existe plusieurs approches alternatives qui offrent de meilleures performances :

1. Utiliser un std::set

Un std::set est un conteneur qui maintient automatiquement un ensemble d'éléments triés et uniques. La conversion du vecteur en un ensemble peut supprimer efficacement les doublons :

std::set<int> s(vec.begin(), vec.end());

Les données triées peuvent ensuite être retransférées vers le vecteur :

vec.assign(s.begin(), s.end());

2. Effacement manuel des doublons

Les doublons peuvent également être effacés manuellement en parcourant le vecteur et en vérifiant les doublons consécutifs :

for (auto it = vec.begin(); it != vec.end(); ) {
  if (*it == *(it+1)) {
    it = vec.erase(it);
  } else {
    ++it;
  }
}

Considérations sur le tri

Le tri après suppression des doublons est nécessaire pour maintenir un ordre trié. Cependant, l'ordre peut ne pas être garanti dans tous les cas :

Cas 1 : Trier d'abord, effacer après

Si le vecteur est trié avant d'effacer les doublons, std :: unique conservera probablement l'ordre de tri.

Cas 2 : Effacer d'abord, Trier Après

Si les doublons sont effacés avant le tri, la commande risque de ne pas être garantie. En effet, l'ordre de suppression peut affecter les indices des éléments suivants.

Performances

Les performances de ces approches varient en fonction du nombre de doublons. Pour un grand nombre de doublons, la conversion en un ensemble puis la reconversion en vecteur peuvent être plus rapides que l'effacement manuel des doublons. Toutefois, pour un petit nombre de doublons, l’effacement manuel peut s’avérer plus efficace.

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