Premier exemple:
int main(){
using namespace std;
vector<int> v1{10, 20, 30, 40, 50};
vector<int> v2{10, 20, 30, 40, 50};
if(v1==v2)
cout<<"equal";
else
cout<<"unequal";
} // it returns equal
Deuxième exemple:
int main(){
using namespace std;
vector<int> v1{10, 20, 30, 40, 50};
vector<int> v2{10, 20, 100000, 40, 50};
if(v1==v2)
cout<<"equal";
else
cout<<"unequal";
} // it returns notequal
La surcharge de operator ==
Qui fonctionne sur deux std::vector
S comparera les tailles des vecteurs et renverra false
si celles-ci sont différentes; sinon, il comparera le contenu du vecteur élément par élément.
Si operator ==
Est défini pour le type d'élément du vecteur, alors la comparaison des vecteurs via operator ==
Est valide et significative.
En termes formels, la norme C++ 11 spécifie la sémantique opérationnelle de a == b
Pour les conteneurs de séquence comme (Tableau 96, § 23.2.1):
==
Est une relation d'équivalence.
distance(a.begin(), a.end()) == distance(b.begin(), b.end()) && equal(a.begin(), a.end(), b.begin())
Comme vous pouvez le voir, l'égalité entre les conteneurs de séquence est définie en termes de l'algorithme std::equal
entre les plages définies par des paires d'itérateurs, qui à son tour utilise operator ==
Pour comparer éléments individuels.
Oui, vous pouvez utiliser operator==
pour comparer deux std::vector
s. Il ne renverra true
que si les vecteurs sont de la même taille et que tous les éléments sont comparables.
Sachez que les vecteurs sont ordonnés et std::equal
ou la ==
L'opérateur vérifie que les vecteurs ont le même contenu dans le même ordre. Pour de nombreux cas d'utilisation, cela peut suffire.
Mais il peut arriver que vous souhaitiez savoir si deux vecteurs ont le même contenu mais pas nécessairement dans le même ordre. Pour ce cas, vous avez besoin d'une autre fonction.
Une mise en œuvre agréable et courte est celle ci-dessous. Il a été suggéré ici: https://stackoverflow.com/questions/17394149/how-to-efficiently-compare-vectors-with-c/17394298#17394298 Vous y trouverez également une discussion sur les raisons vous ne voudrez peut-être pas l'utiliser ...
Mettez ceci dans un fichier d'en-tête de votre choix:
#include <algorithm>
template <class T>
static bool compareVectors(std::vector<T> a, std::vector<T> b)
{
if (a.size() != b.size())
{
return false;
}
::std::sort(a.begin(), a.end());
::std::sort(b.begin(), b.end());
return (a == b);
}
Et voici un exemple illustrant la théorie ci-dessus:
std::vector<int> vector1;
std::vector<int> vector2;
vector1.Push_back(100);
vector1.Push_back(101);
vector1.Push_back(102);
vector2.Push_back(102);
vector2.Push_back(101);
vector2.Push_back(100);
if (vector1 == vector2)
std::cout << "same" << std::endl;
else
std::cout << "not same" << std::endl;
if (std::equal(vector1.begin(), vector1.end(), vector2.begin()))
std::cout << "same" << std::endl;
else
std::cout << "not same" << std::endl;
if (compareVectors(vector1, vector2))
std::cout << "same" << std::endl;
else
std::cout << "not same" << std::endl;
La sortie sera:
not same
not same
same
Vous pouvez consulter la documentation de operator==
pour le vecteur: opérateur ==,! =, <, <=,>,> = (std :: vector)
Citant le lien:
template< class T, class Alloc >
bool operator==( vector<T,Alloc>& lhs,
vector<T,Alloc>& rhs );
Compare le contenu de deux conteneurs.
Vérifie si le contenu de lhs et rhs est égal, c'est-à-dire si lhs.size () == rhs.size () et chaque élément de lhs a un élément équivalent dans rhs à la même position.
paramètres:
lhs, rhs conteneurs dont le contenu à comparer
T doit répondre aux exigences d'EqualityComparable pour utiliser les versions
Valeur de retour
true si le contenu des conteneurs est équivalent, false sinon
Tant que votre vecteur contient des éléments qui peuvent eux-mêmes être comparés (ont operator==
), cela fonctionne, oui. Notez cependant que si vous avez un vecteur qui contient par exemple des pointeurs vers des objets identiques, mais pas la même instance d'un objet, alors le vecteur n'est pas considéré comme identique, car l'élément du vecteur est ce qui est comparé, pas le contenu du élément en tant que tel, si cela a du sens.
Oui. Une bonne référence est cppreference.com , où vous pouvez rechercher operator==
pour vector<T>
, par exemple sur cette page: opérateurs non membres , et vous trouverez:
Vérifie si le contenu de lhs et rhs est égal, c'est-à-dire si lhs.size () == rhs.size () et chaque élément de lhs a un élément équivalent dans rhs à la même position.