2009-11-28 79 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