2012-07-03 7 views
1

이것은 어려운 문제를 해결하는 것보다 배열의 사용법을 더 잘 이해하기위한 것입니다.비교 연산자로 배열 비교

현재 다른 정수 배열과 비교하고 싶은 정수 (네이버스)가 있습니다. 다른 배열에는 저장하지 않아도됩니다. 네 이웃 배열이 동일한 지 알고 싶습니다. 더 나은 모르는 사람으로, 내 첫 번째 시도는이 작업을 수행했다 : 당신이 볼 수 있듯이

if (Neighbors == {1, 1, 0, 0}) 
{ 
    //code... 
} 
else if (Neighbors == {0, 1, 1, 0}) 
{ 
    //code... 
} 
else if (Neighbors == {0, 0, 1, 1}) 
{ 
    //code... 
} 
else if (Neighbors == {1, 0, 0, 1}) 
{ 
    //code... 
} 

는, 정수의 순서가 중요합니다. 그러나 위의 반환 된 컴파일러 오류가 중괄호 토큰 앞에 기본 식 예상합니다.

int Sets[4][4] = { {1, 1, 0, 0}, {0, 1, 1, 0}, {0, 0, 1, 1}, {1, 0, 0, 1} }; 
if (Neighbors == Sets[0]) 
{ 
    //code... 
} 
else if (Neighbors == Sets[1]) 
{ 
    //code... 
} 
else if (Neighbors == Sets[2]) 
{ 
    //code... 
} 
else if (Neighbors == Sets[3]) 
{ 
    //code... 
} 

여기에서 발생하는 것은 그 경우에도 Neighbors = {0, 1, 1, 0} (예를 들어), Neighbors == Sets[1] false를 반환 :

그래서 대신에, 나는이 시도했다.

왜 그런지 궁금하다. 배열 변수는 기본적으로 시퀀스의 첫 번째 요소에 대한 포인터입니다. 권리? 그래서 위의 코드가 작동하지 않는 이유를 얻었습니다. 두 개의 배열보다는 두 개의 메모리 주소를 비교하고 있습니다. 그래서 그 대신 내가 잘 작동이 코드를 썼다 : 내가 알고 싶은 것은 - 두 개의 for 루프를 거치지 않고 같은 배열을 비교하는 방법이 있는지 여부입니다

for (int ii = 0; ii < 4; ++ii) 
    { 
     bool Same = true; 
     for (int jj = 0; jj < 4; ++jj) 
     { 
      if (Neighbors[jj] != Set[ii][jj]) 
      { 
       Same = false; 
      } 
     } 

     if (Same == true) 
     { 
      //code... 
     } 
    } 

. 이보다 더 단순해야하는 것처럼 보입니다. 나는 for-loop가 네 개의 값만 가질 때 특히 집중적이지는 않지만 두 개의 배열이 동일한 정보를 포함하는지 여부를 판별하는 것이 더 쉬울 것이라고 생각했습니다. 각 배열이 연속적인 메모리 블록이라면, 나는 그 두 개의 블록을보고 그것들이 똑같은지 (실제로는 for-loops가하는 일은 수동으로 수행해야 함) 체크 할 수있을 것이라고 생각했을 것이다.

배열의 내용을 직접 비교할 수 있습니다. 한 줄의 코드로 직접 비교하는 것이 좋습니다. 그렇지 않다면 왜 안 되겠습니까? 나는이 문제의 배후에있는 과학을 이해하고 싶다.

+0

여기 팁 - 줄'Same = false; 다음에'break;'문을 추가 할 수 있습니다. 거짓이라면 조금 빨라질 것입니다. 왜 계속 검사를하는지 (unles 너 정말로하고 싶어?) – mathematician1975

+0

사실입니다. 일반적으로 그렇게 하긴하지만, 작은 데이터 세트이기 때문에 이번에는 잊어 버렸습니다. 그래도 알리미 주셔서 감사합니다! – GarrickW

답변

4

C++ 질문에 태그를 지정했습니다. 즉, std::vector을 사용해야합니다. 그것은 당신이 원하는 것을 수행하는 operator==을 두 번 벡터에 오버로드했습니다.

프리미티브 배열을 포함하여 반복자가있는 모든 항목에 std::equal 또는 std::lexicographical_compare을 사용할 수도 있습니다.

물론 operator==에 다른 작업을 수행 할 수 있습니다. 불행하게도 프리미티브 배열에 대해서는 오버로드 할 수 없습니다. 오버로드 연산자는 적어도 하나 이상의 인수가 클래스 (또는 구조체) 유형 인 경우에만 허용되기 때문입니다. 그러나 벡터를 배열과 비교하기 위해이를 재정의 할 수 있습니다. 같은 뭔가 :

template<typename T, typename Alloc, size_t S> 
bool operator==(std::vector<T, Alloc> v, const T (&a)[S]) 
{ 
    return v.size() == S && std::equal(v.begin(), v.end(), a); 
} 

(이 처음 크기를 선언 한 것 확인하기 위해 포인터에 성능이 저하 된 배열에 대한 참조를하지 소요되므로 안전합니다)

물론

이 모든 방법은 그 안에 숨겨진 루프는 요소를 비교 한 하나씩. 그러나 당신은 그것을 쓸 필요가 없습니다.

+0

감사! 나는 그것도 조사 할 것이다. – GarrickW

1

memcmp 기능을 사용할 수 있습니다. 배열이 동일하면 0을 반환합니다. 여기에 설명이 나와 있습니다. http://www.cplusplus.com/reference/clibrary/cstring/memcmp/

+0

오, 나는 몰랐다. 감사! – GarrickW

+0

당신은 환영합니다 :) –

+1

질문은 C++입니다. 'memcmp'는 그 언어에서 부적절합니다. typesafe'std :: lexicographical_compare'를 사용해야합니다. –

4

는 C++이 작업을 수행하는 IEST 방법은 std::equal 함께 :

#include <algorithm> 

C++ 11 :

if (std::equal(begin(Neighbors), end(Neighbors), begin(Sets[0])) 
{ /* then they're equal */ } 

03 C++로 : 그냥

if (std::equal(Neighbors, Neighbors + 4, Sets[0])) 
{ /* then they're equal */ } 
+0

또 다른 흥미있는 기능 - 팁에 감사드립니다! – GarrickW