2011-09-09 14 views
0

boost::transform_iteratorの「通常の」イテレータが必要な問題があります。たとえば、マップからすべてのキーをセットに追加したいとします。 my_setは、単一の値、-858993460または0xccccccccが含まれ、inserttransform_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; 
} 

:私は、次の短いスニペットを書きました。どうして?ループで*bを印刷すると、すべての値が期待どおりに印刷されます。

答えて

1

[OK]を自分で突然に解決しました。問題は、typedef result_typeです(これはドキュメントには記載されていませんが、コードがコンパイルされないと、はmap_keys<K,V>のメンバーではありません))。代わりに、それを型定義すると、

typedef K result_type; 

が動作します。以前書かれたように、それは何かの住所を返したと思いますか?

+0

引数 'kvp'への参照を返しました。これは参照自体であり、おそらく一時的なものです。 BTWは、 'boost :: result_of'の下に' result_type' _is_が書かれていて、 'transform_iterator'は' result_of'を使って文書化されています。 – MSalters

+0

@MSalters:Hm、ok。私は 'result_type'のために文書を検索し、空白になりました。しかし、何を探すべきかを知っている、それはそこにある。私は読書を非常に難しくしています。たくさんのテンプレートがあり、あなたはほとんどすべての木々の森を見ることができません...とにかく、明確化のおかげで! – carlpett

関連する問題