2014-09-23 7 views
1

나는 비교적 새로운했습니다 맵을 사용하여 .find 사용 dereferencable, 나는이 코드 섹션에 저를 가져다 다시 시도 칠 때 나는 현재 Debug Assertion Failed Expression: map/set iterator not dereferencableC++지도/설정 반복자

납니다하지 :

auto temp = mOpenMap.find(currentNode); temp->second = false;

나는 그것을 찾을 수 없습니다,이지도의 끝을 반환하는 .find(currentNode)과 관련이있다 생각하지만, 여기에 관련된 부분은 내 수동 디버깅을하는 것은 내가 발견입니다지도에서 유일하게 Node 실제로 정확한 부분이 포함되어 있습니다. currentNode 또는.

내지도는 이것이다 :

std::map<PathNode*, bool> mOpenMap

낙관적 내가 그것을 원하는 무엇 rowcolumn 검색 이미 있도록 검색 된 노드에서 찾고 있음을 확인하기가 I 함께 boolean을 false로 설정할 수 있습니다.

내가 궁금해하는 점은지도가 일반적으로 개체를 검색하는 방법일까요? 또는 더 나은 방법은, 사용자 정의 검색으로지도 검색을 수행하려면 어떻게해야합니까? 당신은 std::map::find를 확인해야합니다

+0

때로는 참조 대신 값으로 함수에 맵을 전달했음을 나타내는 경우가 있지만,이 경우에는 가능성이 낮습니다. –

답변

3

반복자 역 참조하기 전에 요소를 찾을 않는 : 당신이하고있는 모든 일부 PathNode 또는 기타의 존재를 추적하는 경우

auto temp = mOpenMap.find(currentNode); 
if (temp != mOpenMap.end()) // check temp is pointing to underneath element of a map 
{ 
    temp->second = false; 
} 
+0

이것은 오류를 없앴습니다. 그러나 더 많은 오류를 없애기 전까지는 실제로 트릭을했는지는 알 수 없습니다. (경로가 올바르게 작동하는지 확인하십시오) –

+0

시도 할 때 모든 반복기가 올바른지 확인해야합니다 그들에게 STL 컨테이너를 찾으십시오. btw, whats '다른 오류? – billz

1

, 당신은 std::set를 사용하여 더 나을 것입니다.

사용자 지정 검색의 경우 std::mapstd::set은 모두 값의 모음으로 작동하며 비교 자로 정렬됩니다. 맵 또는 세트가 정의 될 때 그 비교자가 두 번째 템플리트 유형으로 지정 될 수 있습니다. 생략되면 컴파 일러는 기본적으로 std::less으로 설정되며, 단순히 오브젝트를보다 작음 연산자 인 operator<과 비교합니다. 작성한대로 mOpenMap 맵은이 비교를 수행하기 위해 포인터 값을 사용하고 있습니다. 이는 아마도 원하는 것이 아닙니다.

PathNode::operator<을 선언하고 정의하고 mOpenMapstd::set<PathNode> 유형의 멤버로 바꾸는 것이 좋습니다. 이것은 포인터가 아닌 실제 PathNode 값을 키 오프합니다 (보통 상황에서는 절대 충돌하지 않습니다).

PathNode::operator<의 PathNode 객체를으로 엄격하게 생성해야합니다. 이것은 std :: map 및 std :: set에 대한 비교기의 요구 사항입니다. 이 규칙을 지키지 않으면 불규칙하게 동작하지만 컴파일되고 실행되므로이 ​​세부 사항에주의를 기울여야합니다.

+0

이것은 실제로 질문에 대한 대답이 아니며 주석이어야합니다. –

+0

내가하고있는 것과 똑같은 일을 할 수있는 다른 사람들의 답을 얻는 것은 아주 좋은 일입니다. 많은 사람들이 댓글을 보게 될 것입니다. –

+0

댓글이 너무 오래되었습니다. 이것이 더 많은 코드를 보지 않고도 유용하게 쓸모가 있는지 실제로 말하기는 어렵지만,'std :: set '이 필요하지는 않습니다. 왜냐하면'std :: set '은 더 간결하게 처리하지 못합니다. – Wug

1

당신은 결과를 확인해야합니다. 찾기가 실패 할 가능성이 가장 큰 이유는지도가 PathNode *에 입력되어 정확하게 일치하는 노드 만 찾을 수 있다는 것입니다. 지도의 멤버 값과 동일한 멤버 값을 가진 경로 노드를 검색하면 작동하지 않습니다.

지도가 PathNode *이어야하는 경우지도의 세 번째 매개 변수로 predicate도 제공해야합니다. predicate은 두 개의 PathNode * 매개 변수를 구성원 값으로 비교하도록 작성해야합니다.