std :: map.find()旨在将map :: iterator返回给它找到的元素(如果有的话),如果没有则返回end()。我让BadPtr回到我身边。完全相同的构造在代码的其他部分工作正常。这是什么?
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);
}
map :: iterator是为了使运算符*和 - &gt;而被包装的。分别返回OntologyClass对象和指针:
OntologyClass& operator* () {
return *(itr->second);
}
OntologyClass* operator->() {
return itr->second;
}
答案 0 :(得分:1)
这可能与您从std::iterator<bidirectional_iterator_tag, OntologyClass>
继承的事实有关,使您的迭代器value_type为OntologyClass
,而不是指针到{{1} },这是你的地图迭代器使用的。你是如何实现解除引用运算符的?
答案 1 :(得分:0)
如果你可以使用boost我建议使用boost :: transform_iterator。
这个堆栈溢出答案有一个很好的例子,如何做到这一点: iterator adapter to iterate just the values in a map?