1

std::map.find() は、ある場合は見つかった要素に、ない場合は end() に map::iterator を返すことを目的としています。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::transform_iterator を使用することをお勧めします。

このスタックオーバーフローの回答には、それを行う方法の適切な例があります: iterator adapter to iterate just the values in a map?

于 2009-11-28T23:00:29.553 に答える