Comparando matrizes para igualdade em C ++

Alguém pode me explicar por que a saída do código a seguir está dizendo que as matrizes não são iguais ?

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; } 

 if (iar1 == iar2) 

Aqui iar1 e iar2 estão decaindo para os pointers dos primeiros elementos dos respectivos arrays. Como eles são dois arrays distintos, os valores de ponteiro são, é claro, diferentes e seus testes de comparação não são iguais.

Para fazer uma comparação baseada em elementos, você deve escrever um loop; ou use std::array

 std::array iar1 {1,2,3,4,5}; std::array iar2 {1,2,3,4,5}; if( iar1 == iar2 ) { // arrays contents are the same } else { // not the same } 

Como ninguém mencionou ainda, você pode comparar matrizes com o algoritmo 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."; 

Você precisa include e . Se você ainda não usa o C ++ 11, você pode escrever:

 if (std::equal(iar1, iar1 + sizeof iar1 / sizeof *iar1, iar2)) 

Você não está comparando o conteúdo dos arrays, você está comparando os endereços dos arrays. Como eles são dois arrays separados, eles têm endereços diferentes.

Evite esse problema usando contêineres de nível superior, como std::vector , std::deque ou std::array .

Array não é um tipo primitivo e os arrays pertencem a endereços diferentes na memory do C ++.

Você está comparando os endereços em vez dos valores.

Se você estiver relutante em alterar seu código existente para std::array , use alguns methods que usam argumentos de modelo não-tipo :

 //Passed arrays store different data types template  bool equal(T (&arr1)[size1], U (&arr2)[size2] ){ return false; } //Passed arrays store SAME data types template  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; } 

Aqui está a demonstração . Note que, enquanto chamamos, só precisamos passar as variables ​​da matriz, por exemplo, equal(iar1, iar2) no seu caso, não há necessidade de passar o tamanho das matrizes.

Certo. Na maioria , se não em todas as implementações de C, o identificador de matriz pode ser implicitamente convertido em um ponteiro para o primeiro elemento (ou seja, o endereço do primeiro elemento). O que você está fazendo aqui é comparar esses endereços, o que obviamente está errado.

Em vez disso, você precisa fazer uma iteração nos dois arrays, verificando cada elemento um contra o outro. Se você chegar ao final de ambos sem falhar, eles serão iguais.

Quando usamos uma matriz, estamos realmente usando um ponteiro para o primeiro elemento na matriz. Portanto, essa condição if( iar1 == iar2 ) realmente compara dois endereços. Esses pointers não abordam o mesmo object.