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;
}
그래, 나는 심지어 '지도를 사용하는 것이 좋습니다 것 <문자열을 OntologyClass *> :: iterator'는 – orip
네,에 쉬울 것 자신의 iterator 클래스에 map iterator를 래핑하는 대신 map iterator를 반환하면된다. –
1. 가치 유형에 대한 귀하의 메모는 절대적으로 적합합니다. 2. OntologyClass 객체를 검색하기 위해 내부에 쌍의지도가 있습니다. OntologyClass 객체 (포인터)를 반환하는 * 및 -> 연산자가있는 반복기가 필요하므로 표준지도 :: iterator를 래핑했습니다. 그래서 멤버 변수로 사용하는 이유입니다. –
martinthenext