transform_iterator与std :: iterators不兼容?

时间:2011-09-09 09:22:27

标签: c++ iterator

我在使用boost::transform_iterator时遇到“普通”迭代器的问题。例如,我想将地图中的所有键添加到集合中。我写了以下简短的片段:

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包含单个值-8589934600xcccccccc。为什么?如果我在循环中打印*b,则会按预期打印所有值。

1 个答案:

答案 0 :(得分:1)

好的,突然自己解决了。问题是typedef result_type(文档中没有提到,但除非我有,否则代码无法编译(result_type不是map_keys<K,V>的成员))。如果我改为将其定义为

typedef K result_type;

有效。我想,正如之前所写,它返回了某些地址?