Comparaison des tableaux pour l'égalité en C++
Quelqu'un peut-il m'expliquer pourquoi la sortie du code suivant dit que les tableaux sont pas égaux?
int main()
{
int iar1[] = {1,2,3,4,5};
int iar2[] = {1,2,3,4,5};
if (iar1 == iar2)
cout << "Arrays are equal.";
else
cout << "Arrays are not equal.";
return 0;
}
8 réponses
if (iar1 == iar2)
Ici iar1
et iar2
sont en décomposition pour pointer vers les premiers éléments des tableaux respectifs. Comme il s'agit de deux tableaux distincts, les valeurs du pointeur sont, bien sûr, différentes et vos tests de comparaison ne sont pas égaux.
Pour effectuer une comparaison par élément, vous devez soit écrire une boucle; soit utiliser std::array
au lieu de cela
std::array<int, 5> iar1 {1,2,3,4,5};
std::array<int, 5> iar2 {1,2,3,4,5};
if( iar1 == iar2 ) {
// arrays contents are the same
} else {
// not the same
}
Puisque personne ne l'a encore mentionné, vous pouvez comparer les tableaux avec l'algorithme std::equal
:
int iar1[] = {1,2,3,4,5};
int iar2[] = {1,2,3,4,5};
if (std::equal(std::begin(iar1), std::end(iar1), std::begin(iar2)))
cout << "Arrays are equal.";
else
cout << "Arrays are not equal.";
, Vous devez inclure <algorithm>
et <iterator>
. Si vous n'utilisez pas encore C++11, Vous pouvez écrire:
if (std::equal(iar1, iar1 + sizeof iar1 / sizeof *iar1, iar2))
Vous ne comparez pas le contenu des tableaux, vous comparez les adresses des tableaux. Comme ce sont deux tableaux séparés, ils ont des adresses différentes.
Évitez ce problème en utilisant des conteneurs de niveau supérieur, tels que std::vector
, std::deque
, ou std::array
.
Array n'est pas un type primitif, et les tableaux appartiennent à différentes adresses dans la mémoire c++.
Si vous êtes réticent à changer votre code existant en std::array
, utilisez quelques méthodes à la place qui prennent arguments de modèle non-type :
//Passed arrays store different data types
template <typename T, typename U, int size1, int size2>
bool equal(T (&arr1)[size1], U (&arr2)[size2] ){
return false;
}
//Passed arrays store SAME data types
template <typename T, int size1, int size2>
bool equal(T (&arr1)[size1], T (&arr2)[size2] ){
if(size1 == size2) {
for(int i = 0 ; i < size1; ++i){
if(arr1[i] != arr2[i]) return false;
}
return true;
}
return false;
}
Voici la démo . Notez que, lors de l'appel, nous avons juste besoin de passer les variables de tableau par exemple equal(iar1, iar2)
dans votre cas, pas besoin de passer la taille des tableaux.
D'accord. Dans most , sinon toutes les implémentations de C, l'identifiant du tableau peut être implicitement converti en un pointeur vers le premier élément (c'est-à-dire l'adresse du premier élément). Ce que vous faites ici est de comparer ces adresses, ce qui est évidemment faux.
Au Lieu de cela, vous devez itérer sur les deux tableaux, en vérifiant chaque élément l'un par rapport à l'autre. Si vous arrivez à la fin des deux sans échec, ils sont égaux.
Lorsque nous utilisons un tableau, nous utilisons vraiment un pointeur vers le premier élément du tableau. Par conséquent, cette condition if( iar1 == iar2 )
compare en fait deux adresses. Ces pointeurs ne traitent pas le même objet.