2014-04-19 4 views
-1

잘 쓰겠습니다. 스도쿠 퍼즐을 만들고 있습니다. 숫자가 이미 행에 존재하기 때문에 행에 들어갈 수 있는지 비교하려고합니다. 메신저 C에서 # 좋아하고 나는 당신 때문에 누군가가 내가 정확하게 비교할 수 있도록 저를 도울 수있는 C++와 지식의 부족으로 listConnectordown1[c] == fifth[i];에 오류가 메신저를 볼 수있는이STD :: List in C++

for (int i= 0; i< fifth.size(); i++) 
     { 
      for (int c= 0; c<9; c++) 
      { 
       listConnectordown1[c] == fifth[i]; 


//then the number can not go in here because it already exists in the row but not the 
block 
      } 
     } 

있나요?

오류가 지금 벡터 주어진 조언을 변경

4 IntelliSense: no operator "[]" matches these operands 
     operand types are: std::list<int, std::allocator<int>> [ int ] j:\08227 acw\ACW\Sudoku\Sudoku\main.cpp 152 

입니다, 지금은 예를 들어, 제거 할 필요가있을 때 특정 값을 제거하는 방법을 모르는

int possbileChecks[] = {1,2,3,4,5,6,7,8,9}; 
      std::vector<int> fifth (possbileChecks, possbileChecks + sizeof(possbileChecks)/sizeof(int)); 
     for (int i = 0; i < 3; i++) { 
     for (int j = 0; j < 3; j++) { 
      PossibleChecks = Block1[i][j]; 

      if (!PossibleChecks == 0) 
      { 
      PossibleValuesInsideBlock[count] = PossibleChecks; 
      //ValueRemove = count-1; 
      possiblValuesCount = PossibleChecks-1; 
      fifth.Remove(PossibleChecks); 
      possiblValuesCount=0; 

      count = count++; 
      } 

     } 
     } 
+0

ᴋᴇʏsᴇʀ의 대답에 대한 보조 노트로,'std :: list'는 데이터 구조로 연결된 목록을 사용합니다. 링크 된리스트의 경우 랜덤 액세스는 'Big Oh (n)'복잡도를 가지며 배열의 경우 Big Oh (1)입니다. – mostruash

+0

정확히 말하면, 처음부터 끝까지 (또는 이중으로 연결되어 있기 때문에) 전체 목록을 탐색해야합니다. – keyser

+0

C++에서는'sizeof' 사용법이 필요하지 않습니다. – keyser

답변

1

std::list은 색인 액세스 기능을 제공하지 않습니다. 그것은 이중 연결된 목록으로 구현되므로 목록의 요소에 무작위로 액세스하려는 경우 올바른 선택이 아닐 수 있습니다. 당신이 아마 원하는 것은 std::vector입니다 :

std::vector<int> v(1); 
v[0] = 0; 

if(v[0] == 0)... 
    ... // etc 

당신이 beginadvance처럼 반복자 기능을 사용해야 목록에 충실합니다.

+0

루프를 통과 할 때 벡터에서 특정 요소를 제거하는 방법을 알고 있습니다. 목록처럼 간단하지 않기 때문입니다. – user3376687

+0

당신의 스도쿠 표현이 고정 된 크기 (9x9)를 가지지 않길 원하십니까? _ "not set"_을 나타 내기 위해 단순히 값을'-1'로 설정할 수 있습니다. 그렇지 않으면 상대 위치를 가지며 요소를 제거하면 다른 모든 요소가 상쇄됩니다. – keyser

+0

원래 게시물을 편집 했으므로 블럭 안의 내용을 확인한 다음 이미 내부에있는 값을 제거해야하지만 이제는 벡터를 사용하기 때문에 어렵습니다. . – user3376687

0

std :: C++의 목록은 C#의 목록과 같지 않으므로 이와 같은 목록을 반복 할 수는 없습니다. 당신이 반복자를 사용해야 할 것입니다 표준 : : 목록을 반복하는

(표준 :: 목록 :: 반복자) :

list<int>::const_iterator it; 
    for(it = list1.begin();it != list1.end();it++) 
    { 
     for(list<int>::const_iterator c = list1.begin();c != list1.end();c++) 
     { 
      c == it; 
     } 
    } 

또는 루프 기반의 다양한 사용

//Range based for loop 
    for(int i :list1) 
    { 
     for(int c : list2) 
     { 
      i == c; 
     } 
    } 

을 std :: list 대신 std :: vector를 사용하면 코드가 작동합니다.