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;   
}
33
demandé sur emlai 2012-10-13 00:12:32

8 réponses

if (iar1 == iar2)

Ici iar1 et iar2sont 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

}
52
répondu Praetorian 2016-12-29 06:51:14

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))
35
répondu InstallingXubuntuRightNow 2012-10-13 07:25:45

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.

14
répondu Fred Larson 2012-10-12 20:13:52

Array n'est pas un type primitif, et les tableaux appartiennent à différentes adresses dans la mémoire c++.

6
répondu Paul S. 2012-10-12 20:13:41

Vous comparez les adresses au lieu des valeurs.

1
répondu Rahul Tripathi 2012-10-12 20:15:13

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.

1
répondu Saurav Sahu 2017-09-29 05:11:18

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.

0
répondu slugonamission 2012-10-12 20:28:28

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.

0
répondu vladinkoc 2012-10-17 11:01:03