93 votes

Comment comparer deux vecteurs pour l'égalité élément par élément en C++ ?

Existe-t-il un moyen de comparer deux vecteurs ?

if (vector1 == vector2)
    DoSomething();

Note : Actuellement, ces vecteurs ne sont pas triés et contiennent des valeurs entières.

26 votes

Vous voulez dire que vous voulez comparer indépendamment de de l'ordre des éléments du vecteur ? Sinon, le code ci-dessus devrait fonctionner.

1 votes

Une façon simple de comparer deux tableaux non triés dont vous voulez vérifier qu'ils contiennent exactement les mêmes valeurs, est la suivante les trier puis utiliser l'une des méthodes de la bibliothèque standard pour effectuer une comparaison.

0 votes

Si seulement c'était aussi simple. VS2013 utilise std::equals pour mettre en œuvre == mais il y a ensuite des alertes au moment de l'exécution parce que les itérateurs ne proviennent pas du même conteneur ( !). _ITERATOR_DEBUG_LEVEL=1 (ou =0 ) sur tous les projets qui utilisent, ou pourraient utiliser, == . Arg !

95voto

solvingPuzzles Points 2186

Votre code ( vector1 == vector2 ) est une syntaxe C++ correcte. Il existe un == pour les vecteurs.

Si vous voulez comparer un vecteur court avec une portion d'un vecteur plus long, vous pouvez utiliser la fonction equal() pour les vecteurs. ( documentation ici )

Voici un exemple :

using namespace std;

if( equal(vector1.begin(), vector1.end(), vector2.begin()) )
    DoSomething();

4 votes

Std::equal() est également valable pour les tableaux simples, alors que l'opérateur d'égalité ne l'est pas, par exemple : int a[1000], b[1000] ; if(std::equal(a, a+1000,b)) DoSomething() ;

10 votes

Bonne réponse, sauf qu'elle encourage les mauvaises pratiques ( using namespace std ) au lieu d'utiliser l'option plus claire std::equal .

19voto

Jhaliya Points 24039

Vérifiez std::mismatch de la méthode C++.

La comparaison des vecteurs a été discutée sur Forum DaniWeb et aussi répondu à .

C++ : Comparaison de deux vecteurs

Vérifiez le poste ci-dessous SO. sera utile pour vous. ils ont réalisé la même chose avec la méthode different-2.

Comparer deux vecteurs C++

0 votes

Cela nécessite-t-il que la gamme soit triée ?

2 votes

lexicographical_compare fonctionne ici aussi, et évite d'avoir à se demander quelle est la portée la plus longue.

16 votes

Veuillez poster les détails du lien auquel vous vous référez ici, si ce lien disparaît à l'avenir, la réponse entière devient inutile.

8voto

Ciro Santilli Points 3341

La norme C++11 sur == para std::vector

Autres ont mentionné que operator== compare les contenus et les œuvres des vecteurs, mais voici une citation du Projet de norme C++11 N3337 ce qui, je crois, implique que.

Nous examinons d'abord le chapitre 23.2.1 "Exigences générales relatives aux conteneurs", qui documente les éléments qui doivent être valables pour tous les conteneurs, y compris donc std::vector .

Le tableau 96 de cette section, intitulé "Exigences relatives aux conteneurs", contient une entrée :

Expression   Operational semantics
===========  ======================
a == b       distance(a.begin(), a.end()) == distance(b.begin(), b.end()) &&
             equal(a.begin(), a.end(), b.begin())

Le site distance une partie de la sémantique signifie que la taille des deux conteneurs est la même, mais elle est énoncée d'une manière conviviale pour les itérateurs généralisés pour les conteneurs adressables à accès non aléatoire. distance() est défini à la section 24.4.4 "Opérations sur les itérateurs".

Alors la question clé est de savoir ce que equal() moyen. A la fin du tableau, nous voyons :

Remarques : l'algorithme equal() est défini dans la clause 25.

et dans la section 25.2.11 "Equal" nous trouvons sa définition :

template<class InputIterator1, class InputIterator2>
bool equal(InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2);

template<class InputIterator1, class InputIterator2,
class BinaryPredicate>
bool equal(InputIterator1 first1, InputIterator1 last1,
           InputIterator2 first2, BinaryPredicate pred);

1 Retourne : vrai si pour chaque itérateur i dans l'intervalle [first1,last1) les conditions correspondantes suivantes sont remplies : *i == *(first2 + (i - first1)) , pred(*i, *(first2 + (i - first1))) != false . Sinon, il renvoie un message faux.

Dans notre cas, nous nous préoccupons de la version surchargée sans BinaryPredicate version, qui correspond à la première définition du pseudo-code *i == *(first2 + (i - first1)) qui, nous le voyons, n'est qu'une définition adaptée aux itérateurs de "tous les éléments itérés sont identiques".

Questions similaires pour d'autres conteneurs :

4voto

Shahrukh Haider Points 330

Selon la discussion aquí vous pouvez comparer directement deux vecteurs en utilisant

\==

if (vector1 == vector2){
   //true
}
else{
   //false
}

1voto

darvids0n Points 7914

S'ils doivent absolument rester non triés (ce qui n'est pas le cas et si vous avez affaire à des centaines de milliers d'éléments, je me demande pourquoi vous comparez des vecteurs comme ça), vous pouvez bricoler une méthode de comparaison qui fonctionne avec des tableaux non triés.

Le seul moyen auquel j'ai pensé pour faire cela était de créer un temporaire vector3 et faire semblant de faire un set_intersection en ajoutant tous les éléments de vector1 puis en faisant une recherche pour chaque élément individuel de la vector2 sur vector3 et le supprimer s'il est trouvé. Je sais que cela semble terrible, mais c'est la raison pour laquelle je n'écrirai pas de bibliothèque standard C++ de sitôt.

Vraiment, cependant, il suffit de les trier d'abord.

0 votes

Ou peut être en créer deux set des objets et les comparer ? Cela ne serait-il pas plus facile s'il est vraiment nécessaire de ne pas toucher les vecteurs ?

0 votes

Cela dépend de la rapidité des opérations de recherche et de suppression de N sur un vecteur ( N*O(N) ) contre 2 constructeurs d'ensembles triant N éléments (la référence de cplusplus.com dit "Pour les séquences non triées, linearithmic (N*logN)..") + une comparaison triée ( O(N) ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X