简体   繁体   English

std :: map查找无法正常工作

[英]std::map find doesn't work properly

std::map.find() is intended to return an map::iterator to an element it found if there is some or to the end() if not. std :: map.find()旨在将map :: iterator返回到找到的某个元素(如果有的话),或者返回end(),如果没有的话。 I get BadPtr returned to me. 我得到BadPtr还给我。 The exactly same construct works fine in the other part of code. 完全相同的构造在代码的其他部分也可以正常工作。 What is this? 这是什么?

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 is wrapped for the sake of making operators * and -> returning OntologyClass objects and pointers respectively: map :: iterator的包装是为了使运算符*和->分别返回OntologyClass对象和指针:

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

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

It might be something to do with the fact that you inherit from std::iterator<bidirectional_iterator_tag, OntologyClass> , making your iterator value_type to be OntologyClass , rather than a pointer to OntologyClass , which is what your map iterator uses. 这可能与您继承自std::iterator<bidirectional_iterator_tag, OntologyClass>的事实有关,使您的迭代器value_type为OntologyClass ,而不是指向地图迭代器使用的OntologyClass指针 How are you implementing the dereference operator? 您如何实现取消引用运算符?

if you can use boost I suggest using boost::transform_iterator. 如果可以使用boost,我建议使用boost :: transform_iterator。

This stack overflow answer has a decent example on how to do that: iterator adapter to iterate just the values in a map? 这个堆栈溢出的答案有一个很好的例子,说明如何做到: 迭代器适配器仅对映射中的值进行迭代?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM