1

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 被包装是为了让操作符 * 和 -> 分别返回 OntologyClass 对象和指针:

            OntologyClass& operator* () {
        return *(itr->second);
    }

    OntologyClass* operator->() {
        return itr->second;
    }
4

2 回答 2

1

这可能与您从 继承的事实有关std::iterator<bidirectional_iterator_tag, OntologyClass>,使您的迭代器 value_type 成为OntologyClass,而不是指向 的指针OntologyClass这是您的地图迭代器使用的。你是如何实现解引用运算符的?

于 2009-11-28T20:23:06.163 回答
0

如果你可以使用 boost,我建议使用 boost::transform_iterator。

这个堆栈溢出答案有一个很好的例子来说明如何做到这一点: 迭代器适配器只迭代地图中的值?

于 2009-11-28T23:00:29.553 回答