std :: map查找无法正常工作
问题描述:
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;
}
答
它可能是与你继承的事实std::iterator<bidirectional_iterator_tag, OntologyClass>
,使您的迭代器value_type为OntologyClass
,而不是指针到OntologyClass
,这是您的地图迭代器使用的。你如何实现解引用操作符?
答
如果你可以使用升压,我建议使用boost :: transform_iterator。
这堆栈溢出答案对如何做到这一点像样的例子: iterator adapter to iterate just the values in a map?
是啊,我甚至会建议使用'地图 :: iterator' – orip 2009-11-28 20:30:31
是的,它会更容易只需返回一个映射迭代器,而不是将迭代器包装到自己的迭代器类中。 – 2009-11-28 20:33:52
1.你对价值型值得注意的是绝对正确的,谢谢 2.我有地图对内搜索OntologyClass对象。我需要一个带*和 - >运算符的迭代器来返回OntologyClass对象(指针),所以我包装了标准映射 :: iterator。这就是为什么我把它作为一个成员变量。 –
martinthenext
2009-11-28 20:34:49