2009-10-04 1 views
0

Я пытаюсь сравнить два массива int, элемент за элементом, чтобы проверить равенство. Кажется, я не могу заставить это работать. Также приветствуются основные ресурсы указателя. Спасибо!Вопрос софтбол C++: как сравнить два массива для равенства?

int *ints; 
ints = new int[10]; 

bool arrayEqual(const Object& obj) 
{ 
    bool eql = true; 

    for(int i=0; i<10; ++i) 
    { 
     if(*ints[i] != obj.ints[i]) 
      eql = false; 
    } 

    return eql; 
} 
+0

разыменовывание произвольных типов указателей кажется подозрительным для меня. – whatnick

+2

Вместо переменной eql, почему бы не заменить "eql = false;" по "return false"; и "return eql;" по "return true",? Поведение должно быть одинаковым, а функция быстрее. – luiscubal

ответ

2

Когда вы if(*ints[i] != obj.ints[i]), что вы сравниваете это адрес указываемого ints[i] с содержанием obj.ints[i], а содержание самого ints[i]. Это потому, что имя массива уже является указателем на первый элемент массива, и когда вы добавляете индекс, вы будете искать i-ю позицию после первого в этом массиве. Вот почему вам не нужен *.

Правильным является:

int *ints; 
ints = new int[10]; 

bool arrayEqual(const Object& obj) 
{ 
    bool eql = true; 

    for(int i=0; i<10; ++i) 
    { 
     if(ints[i] != obj.ints[i]) 
       eql = false; 
    } 

    return eql; 
} 

Надежда Я помог!

15

Как насчет следующего?

 
#inlcude <algorithm> 

bool arrayEqual(const Object& obj) 
{ 
    return std::equal(ints,ints + 10, obj.ints); 
} 

Примечание: равная функция требует, чтобы оба массива были одинакового размера.

+0

Сопротивление: это просто требует, чтобы последний диапазон имел _at наименьший_ столько же, сколько первый. – Macke

+2

CounterCounterNote: Вы абсолютно правы. – 2009-10-04 20:08:13

0

Я предполагаю, что это все обернуто «классом Object {" и "}"?

Просто удалите «*», и он должен работать.

2

Я удивлен, что никто не спросил, почему вы используете массивы в первую очередь. Хотя есть места, где массивы могут быть трудно избежать, их немного и далеко. В большинстве случаев ваш код будет проще использовать std :: vector. Поскольку std :: vector перегружает operator ==, все, что вам нужно сделать в этом случае, это что-то вроде if (a==b) ... Даже в тех немногих местах, что этот вектор не подходит, TR1 :: array часто выполняет задание (и IIRC, он предоставляет перегрузка оператора ==).