2009-11-28 2 views
1

std :: map.find()는 map :: iterator를 찾을 수있는 요소가 있으면 찾거나 그렇지 않으면 end()에 반환하기위한 것입니다. BadPtr이 나에게 돌아왔다. 정확히 같은 구조가 다른 부분의 코드에서도 잘 작동합니다. 이게 뭐야?std :: map find가 제대로 작동하지 않습니다.

class OntologyContainer { 
    map<string, OntologyClass*> data; 
    OntologyClass* last_added; 
public: 
    class iterator : public std::iterator<bidirectional_iterator_tag, OntologyClass> { 
     map<string, OntologyClass*>::iterator itr; 
    public: 
     iterator(map<string, OntologyClass*>::iterator it) : itr(it) { } 

    ... 
    } 

    iterator begin() { 
     return iterator(data.begin()); 
    } 

    iterator end() { 
     return iterator(data.end()); 
    } 

    iterator Find(const string & to_find) { 
     map<string, OntologyClass*>::iterator it = data.find(to_find); 
     // this is where it fails 
     return iterator(it); 
    } 

지도 :: 반복자는 연산자를 만들기 위해 래핑 *와 -> 각각 OntologyClass 객체와 포인터를 반환 :

  OntologyClass& operator*() { 
     return *(itr->second); 
    } 

    OntologyClass* operator->() { 
     return itr->second; 
    } 

답변

1

당신이 상속 사실 함께 할 수있는 뭔가 수 있습니다 std::iterator<bidirectional_iterator_tag, OntologyClass>, 이터레이터 value_type을 포인터 ~ OntologyClass이 아닌 OntologyClass으로 만드는 것입니다. 이것이 맵 반복기에서 사용하는 것입니다. 역 참조 연산자를 어떻게 구현하고 있습니까?

+0

그래, 나는 심지어 '지도를 사용하는 것이 좋습니다 것 <문자열을 OntologyClass *> :: iterator'는 – orip

+2

네,에 쉬울 것 자신의 iterator 클래스에 map iterator를 래핑하는 대신 map iterator를 반환하면된다. –

+0

1. 가치 유형에 대한 귀하의 메모는 절대적으로 적합합니다. 2. OntologyClass 객체를 검색하기 위해 내부에 쌍의지도가 있습니다. OntologyClass 객체 (포인터)를 반환하는 * 및 -> 연산자가있는 반복기가 필요하므로 표준지도 :: iterator를 래핑했습니다. 그래서 멤버 변수로 사용하는 이유입니다. – martinthenext

관련 문제