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.