2014-09-27 4 views
0

Как определить, соответствуют ли два 2D-массива каждому элементу? Они имеют равные размеры.Проверьте, равны ли два 2D-массива

std::equal, похоже, не работает.

Я попытался написать простую функцию

bool arrays_equal(int a[][], int b[][]) 
{ 
... 
} 

но мне нужно последнее измерение обоих массивов передать двумерный массив. Будет ли это сделано с использованием (sizeof(a[0])/sizeof(*(a[0])))?

ответ

1

Предполагая, что вы знаете точный размер каждого массива, и они известны во время компиляции, тогда сравнение - это просто memcmp() с правильным размером.

// you somehow know the size of the array 
int a[WIDTH][HEIGHT]; 
int b[WIDTH][HEIGHT]; 

bool const equal(memcmp(a, b, sizeof(int) * WIDTH * HEIGHT) == 0); 

// and if defined in the same scope, you can even use: 
bool const equal(memcmp(a, b, sizeof(a)) == 0); 

Обратите внимание, что в моем коде предполагается, что оба массива (a и b) имеют одинаковый размер. Вы можете проверить это, прежде всего, чтобы убедиться, с броском или, может быть, утверждать, например std :: assert (sizeof (a) == sizeof (b)).

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

+0

Вы всегда можете использовать версию 'sizeof a' –

+0

Да. 'sizeof a' всегда доступен. Однако, если вы сделали что-то вроде 'a = new int [32]', то 'sizeof a' возвращает размер указателя, а не размер массива. –

2

Может быть, так?

bool arrays_equal(std::array<std::array<int, M>, N> const & lhs, 
        std::array<std::array<int, M>, N> const & rhs) 
{ 
    return lhs == rhs; 
} 

Значение M и N должны быть вашими размерами массива, или вы могли бы сделать их параметры шаблона функции. Не забудьте указать #include <array>.

+0

Итак, вы предполагаете, что я использую 'std :: array' вместо массивов C, если я хочу проверить, равны ли они? – qwr

+0

@qwr Да. https://stackoverflow.com/questions/6111565/now-that-we-have-stdarray-what-uses-are-left-for-c-style-arrays – CoryKramer

+0

@Cyber ​​В моих программах на C++ я использовал массивы размер во время выполнения. Означает ли это (согласно http://stackoverflow.com/questions/737240/cc-array-size-at-run-time-wo-dynamic-allocation-is-allowed) Я использовал недопустимый код на C++ в целом время? – qwr

Смежные вопросы