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.
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.
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();
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() ;
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.
lexicographical_compare
fonctionne ici aussi, et évite d'avoir à se demander quelle est la portée la plus longue.
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.
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 :
Selon la discussion aquí vous pouvez comparer directement deux vecteurs en utilisant
\==
if (vector1 == vector2){
//true
}
else{
//false
}
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.
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 ?
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.
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 !0 votes
cplusplus.com/référence/vecteur/vecteur/opérateurs
vector
supporte à la fois==
y<
comparaisons de types