web-dev-qa-db-fra.com

Puis-je utiliser '==' pour comparer deux vecteurs. Je l'ai essayé et semble bien fonctionner. Mais je ne sais pas si cela fonctionnera dans des situations plus complexes

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 
44
suman shadow

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.

65
Andy Prowl

Oui, vous pouvez utiliser operator== pour comparer deux std::vectors. Il ne renverra true que si les vecteurs sont de la même taille et que tous les éléments sont comparables.

7

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
3
Tony

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

2
taocp

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.

1
Mats Petersson

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.

1
huskerchad