2014-11-19 2 views
0

내 학교 프로젝트에서 한 가지 문제에 봉착했습니다. 키 번호에 매핑 된 숫자가 필요합니다. ZZ은 NTL 라이브러리의 큰 정수를위한 클래스이지만 중요하지는 않습니다. 내 프로그램은 항상 it_set2을 반복 할 수 없다는 메시지와 함께 내부 루프에서 실패합니다.C++지도에서 세트를 반복하는 방법?

std::map<ZZ, std::set<ZZ>> mapa; 
std::map<ZZ, std::set<ZZ>>::iterator it_map; 
std::set<ZZ>::iterator it_set1, it_set2;  

for (it_map = mapa.begin(); it_map != mapa.end(); ++it_map) {  
    for (it_set1 = it_map->second.begin(); it_set1 != it_map->second.end(); ++it_set1) { 
     for (it_set2 = ++it_set1; it_set2 != it_map->second.end(); ++it_set2) { 
      /* 
      some function that uses *it_set1, *it_set2 
      */ 
     } 
    } 
} 

도움 주셔서 감사합니다.

+0

예제가 컴파일되고 실행 중입니다. (https://ideone.com/mi2bFV) – tgmath

+0

@tgmath : 빈지도에만 해당됩니다. 나는 OP의지도가 비어 있지 않다고 생각한다.) – bitmask

+2

그러면 실패한 예제가 도움이 될 것이다. :) – tgmath

답변

1

문제가 가장 안쪽 루프에 있다고 가정합니다. it_set2이 현재 it_set1이 가리키는 다음 요소 (실제로는 it_set1을 증가시키지 않음)를 가리키고 싶으면 세 번째 루프를 for(it_set2 = it_set1; ++it_set2 != it_map->second.end();)으로 변경해야합니다.

이렇게하면 불필요한 경우가 아니라 범위를 벗어나지 않고 it_set1을 증가시키지 않습니다.

+0

A도이'if (* it_set1 == * it_set2) {계속;}'를 추가 했으니 지금은 괜찮습니다. 고마워. –

0

제공 한 정보가 주어지면 두 번째 루프에서 마지막 set-element를 치려고 할 때 문제가 발생할 것으로 생각됩니다. 마지막 요소를 반복하면 세 번째 루프는 it_set1을 증가시키고 그 다음은 end 반복기입니다 (마지막 요소를보고 있던대로). 세 번째 for 루프가 끝나고 두 번째 루프는 ++it_set1 인 이터레이터를 end 지나서 이동 시켜서 정의되지 않은 동작을 호출하여 과거 본문 명령을 실행합니다.

+0

을 추가하여 코드를 개선 한 경우 (++ it_set1 == it_map-> second.end()) { break; } 하지만 마지막 도움이되지 않았지만 도움이되지 않았습니다. 해결책이 있습니까? 반응에 감사드립니다. –

+0

@ MatejProcházka : 사람들이 재현 할 수있는 완전한 모범을 제공하십시오. 그렇지 않으면, 아무도 당신을 도울 수 없을 것입니다. – bitmask

관련 문제