std :: map find не работает должным образом - PullRequest
1 голос
/ 28 ноября 2009

std :: map.find () предназначен для возврата 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;
    }

Ответы [ 2 ]

1 голос
/ 28 ноября 2009

Это может быть связано с тем фактом, что вы наследуете от std::iterator<bidirectional_iterator_tag, OntologyClass>, что делает ваш итератор value_type равным OntologyClass, а не указатель на OntologyClass, который является вашей картой Итератор использует. Как вы реализуете оператор разыменования?

0 голосов
/ 29 ноября 2009

если вы можете использовать boost, я предлагаю использовать boost :: transform_iterator.

Этот ответ о переполнении стека имеет хороший пример того, как это сделать: адаптер итератора для итерации только значений в карте?

...