2009-11-28 104 views
1

std :: map.find()用於返回一個map :: iterator到它發現的元素,如果有的話,或者如果沒有,則返回end()。我得到BadPtr回到我身邊。完全相同的構造在代碼的其他部分工作正常。這是什麼?std :: map查找無法正常工作

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 2009-11-28 20:30:31

+2

是的,它會更容易只需返回一個映射迭代器,而不是將迭代器包裝到自己的迭代器類中。 – 2009-11-28 20:33:52

+0

1.你對價值型值得注意的是絕對正確的,謝謝 2.我有地圖<字符串,OntologyClass *>對內搜索OntologyClass對象。我需要一個帶*和 - >運算符的迭代器來返回OntologyClass對象(指針),所以我包裝了標準映射 :: iterator。這就是爲什麼我把它作爲一個成員變量。 – martinthenext 2009-11-28 20:34:49