Может кто-нибудь, пожалуйста, объясните мне, почему вывод из следующего кода говорит, что массивы не равный?
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)
Вот 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
}
Поскольку никто еще не упомянул об этом, вы можете сравнить массивы с 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>
, Если вы еще не используете C ++ 11, вы можете написать:
if (std::equal(iar1, iar1 + sizeof iar1 / sizeof *iar1, iar2))
Вы не сравниваете содержимое массивов, вы сравниваете адреса массивов. Поскольку это два отдельных массива, они имеют разные адреса.
Избегайте этой проблемы, используя контейнеры более высокого уровня, такие как std::vector
, std::deque
, или же std::array
,
Массив не является примитивным типом, а массивы принадлежат разным адреса в памяти C ++.
Вы сравниваете адреса вместо значений.
Если вы не хотите менять существующий код на std::array
, а затем использовать несколько методов вместо нетиповые аргументы шаблона :
//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)
в вашем случае не нужно передавать размеры массивов.
Правильно. В самый, если не все реализации языка C, идентификатор массива может быть неявно приведен к указателю на первый элемент (то есть адрес первого элемента). Здесь вы сравниваете эти адреса, что, очевидно, неправильно.
Вместо этого вам нужно перебрать оба массива, проверяя каждый элемент друг против друга. Если вы доберетесь до конца обоих без сбоев, они равны.
Когда мы используем массив, мы действительно используем указатель на первый элемент в массиве. Следовательно, это условие if( iar1 == iar2 )
на самом деле сравнивает два адреса. Эти указатели не обращаются к одному и тому же объекту.