2011-09-09 63 views
0

我在使用boost::transform_iterator s時遇到了問題,那裏需要「普通」迭代器。例如,我想將地圖中的所有密鑰添加到集合中。我寫了下面一小段:transform_iterator與std :: iterators不兼容?

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

好的,突然自己解決了。問題是typedef result_type(在文檔中沒有提到,但除非我擁有它,代碼不會編譯(result_type不是map_keys<K,V>的成員))。如果我不是它的typedef作爲

typedef K result_type; 

它的工作原理。我想,如前所述,它返回了一些東西的地址?

+0

它返回參數'kvp'的引用。這是一個參考本身,也可能是暫時的。順便說一下,在'boost :: result_of'和'transform_iterator'下記錄'result_type'被記錄爲使用'result_of'。 – MSalters

+0

@ MSalters:嗯,好的。我在文檔中搜索了'result_type',它變成空白。但知道要尋找什麼,它就在那裏。我發現閱讀助推文檔相當辛苦,遍地都有很多模板,你幾乎看不到所有樹木的森林......無論如何,感謝您的澄清! – carlpett

相關問題