transform_iterator не совместим с std :: iterators? - PullRequest
0 голосов
/ 09 сентября 2011

У меня проблемы с использованием boost::transform_iterator s, где ожидаются "обычные" итераторы. Например, я хочу добавить все ключи с карты в набор. Я написал следующий короткий фрагмент:

template <typename K, typename V>
struct map_keys {
    typedef const K& result_type;
    const K& operator()(const std::pair<K,V>& kvp) const {
        return kvp.first;
    }
};

int main() {
    std::map<int, double> my_map;
    std::set<int> my_set;
    my_map[1]=1.2;
    my_map[2]=2.4;
    my_map[4]=4.1;
    my_map[6]=12.2;
    my_map[123]=3;
    typedef map_keys<int, double> mk;
    auto b = boost::make_transform_iterator(my_map.begin(), mk()),
        e = boost::make_transform_iterator(my_map.end(), mk());
    my_set.insert(b,e);
    return 0;
}

После insert, my_set содержит одно значение, -858993460 или 0xcccccccc. Зачем? Если я печатаю *b в цикле, все значения печатаются, как и ожидалось.

1 Ответ

1 голос
/ 09 сентября 2011

Ок, решил сам, вдруг. Проблема заключается в typedef result_type (который не упомянут в документации, но если он у меня не установлен, код не компилируется (result_type не является членом map_keys<K,V>)) Если я вместо этого наберу это как

typedef K result_type;

Это работает. Полагаю, как было написано ранее, он вернул адрес чего-то?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...