Подтвердить что ты не робот

Сравнение массивов для равенства в С++

Может кто-нибудь объяснить мне, почему вывод из следующего кода говорит, что массивы не равны?

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

Ответ 1

if (iar1 == iar2)

Здесь iar1 и iar2 распадаются на указатели на первые элементы соответствующих массивов. Поскольку они представляют собой два разных массива, значения указателя, разумеется, различны, и ваши сравнительные тесты не равны.

Чтобы сделать элементарное сравнение, вы должны либо написать цикл; или используйте std::array вместо

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

}

Ответ 2

Поскольку никто еще не упомянул об этом, вы можете сравнить массивы с алгоритмом 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.";

Вам нужно включить <algorithm> и <iterator>. Если вы еще не используете С++ 11, вы можете написать:

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

Ответ 3

Вы не сравниваете содержимое массивов, вы сравниваете адреса массивов. Поскольку они представляют собой два отдельных массива, у них разные адреса.

Избегайте этой проблемы с помощью контейнеров более высокого уровня, таких как std::vector, std::deque или std::array.

Ответ 4

Массив не является примитивным типом, а массивы принадлежат различным адресам в памяти С++.

Ответ 5

Вы сравниваете адреса вместо значений.

Ответ 6

Если вы не захотите изменить существующий код на std::array, используйте вместо него несколько методов, которые принимают аргументы шаблона 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;
}

Вот демон . Обратите внимание, что при вызове нам просто нужно передать переменные массива, например. equal(iar1, iar2) в вашем случае не нужно передавать размер массивов.

Ответ 7

Right. В большинстве, если не во всех реализациях C, идентификатор массива может быть неявно ливан в указатель на первый элемент (то есть адрес первого элемента). То, что вы здесь делаете, сравнивает эти адреса, что явно неверно.

Вместо этого вам нужно перебирать оба массива, проверяя каждый элемент друг на друга. Если вы дойдете до конца и без неудачи, они равны.

Ответ 8

Когда мы используем массив, мы действительно используем указатель на первый элемент массива. Следовательно, это условие if( iar1 == iar2 ) фактически сравнивает два адреса. Эти указатели не адресуют один и тот же объект.

Ответ 9

Никто не упоминает memcmp? Это тоже хороший выбор.

/* memcmp example */
#include <stdio.h>
#include <string.h>

int main ()
{
  char buffer1[] = "DWgaOtP12df0";
  char buffer2[] = "DWGAOTP12DF0";

  int n;

  n=memcmp ( buffer1, buffer2, sizeof(buffer1) );

  if (n>0) printf ("'%s' is greater than '%s'.\n",buffer1,buffer2);
  else if (n<0) printf ("'%s' is less than '%s'.\n",buffer1,buffer2);
  else printf ("'%s' is the same as '%s'.\n",buffer1,buffer2);

  return 0;
}

Ссылка: http://www.cplusplus.com/reference/cstring/memcmp/

Ответ 10

при сравнении... просто сделайте это.....

if (*iar1 == *iar2)

пока вы добавляете "*", вы нарушаете адрес... и теперь вы сравниваете значения