2014-09-27 2 views
0

두 개의 2D 배열이 모든 요소와 정확히 일치하는지 어떻게 알 수 있습니까? 그것들은 같은 치수를 가지고 있습니다.두 개의 2D 배열이 같은지 확인하십시오.

std::equal이 작동하지 않는 것 같습니다.

는 I 간단한 함수를

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

쓰기 시도했지만 다음 I는 2 개 차원 어레이를 전달하는 두 배열의 최종 치수가 필요하다. 그게 (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; 
} 

MN은 배열의 차원해야한다, 또는 당신은 그 (것)들에게 함수 템플릿 매개 변수를 만들 수 있습니다. #include <array>을 잊지 마세요.

+0

그렇다면 C 배열 대신에'std :: array'를 사용하여 그 배열이 동일한 지 확인하고 싶습니다. – 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