2011-09-01 1 views
3

Existe-t-il un moyen de faire fonctionner les opérateurs d'égalité pour comparer des tableaux du même type?L'égalité des contenus de tableau en C++

Par exemple:

int x[4] = {1,2,3,4}; 
int y[4] = {1,2,3,4}; 
int z[4] = {1,2,3,5}; 
if (x == y) cout << "It worked!" 

Je suis conscient que tel quel, il est juste la comparaison des valeurs de pointeur - mais j'espérais il y a une sorte de typedef truc ou quelque chose comme ça il aurait pas besoin d'une boucle ou un appel de memcmp.

+5

Je suggère d'utiliser un 'vECTOR' au lieu d'un tableau pour ce. – MAK

+0

J'utilise presque toujours des vecteurs, donc je suis d'accord, mais dans ce cas le nombre d'éléments sera constamment 5 et cela ne changera jamais, donc j'ai pensé qu'un simple tableau serait meilleur. –

+0

pourquoi pensez-vous que ce serait mieux? Vous pouvez parfaitement travailler avec des vecteurs de taille constante. – KillianDS

Répondre

18

Vous pouvez utiliser algorithme standard equal

if (std::equal(x,x+4,y)) cout << "It worked!"; 
10

Utilisez std::equal comme:

if(std::equal(x, x+ xsize, y)) std::cout << "equal"; 

Il vérifie l'égalité des éléments dans le même ordre. Cela signifie que, selon std::equal, les tableaux suivants ne sont pas égaux.

int x[4] = {1,2,3,4}; 
int y[4] = {1,2,4,3}; //order changed! 
+0

La partie 'set_difference' est fausse ... cet algorithme exige comme condition préalable que les deux plages soient triées, ce qui signifie qu'il ne peut pas être appliqué au exemple ci-dessus - et fournira la mauvaise sortie, probablement quelque chose dans les lignes de '[3,3]'.Là encore, si vous allez ordonner les tableaux avant d'appeler l'algorithme, et que vous vous souciez seulement de l'égalité, le 'std :: equal' suffira et sera moins cher que' std :: set_difference' –

+0

@David: Oui. J'ai vu le doc, et j'ai réalisé cela. Retiré la partie incorrecte. – Nawaz

8

Une autre façon serait d'envelopper vos tableaux dans le modèle std::array, qui fera une petite classe wrapper pour le tableau. Tout fonctionne à peu près comme la normale, sauf que vous obtenez une définition par défaut de operator=, de sorte que vous pouvez utiliser == comme d'habitude pour faire la chose attendue.

0

Je pense qu'il est également utile de noter ici que C++ ne vous permet pas de surcharger operator== sans au moins 1 type défini par l'utilisateur. Ce serait la "bonne" solution, mais même si vous le pouviez, ce serait probablement une mauvaise idée. Les tableaux en C++ ... sont en quelque sorte des créatures maléfiques des bois.

std::equal est probablement votre meilleur pari. Bien que vous puissiez probablement faire ce que vous voulez avec une macro * gasp *, je pense que c'est gacky.

1

Puisque les tableaux sont du même type et la longueur, vous pouvez utiliser memcmp pour tester l'égalité, qui est l'égalité de la valeur et la position:

int array1[4] = {1, 2, 3, 4}; 
int array2[4] = {5, 6, 7, 8}; 

if (memcmp(array1, array2, sizeof(array1)) == 0) 
{ 
    cout << "arrays are equal" << "\n"; 
} 
else 
{ 
    cout << "arrays are not equal" << "\n"; 
} 
+0

Il est dommage que cette réponse n'ait pas eu plus de rejets; les gens semblent être allergiques à C même si cela peut parfois rendre le code meilleur (par exemple '+ 4' et' sizeof'). – congusbongus

Questions connexes