0
boost::transform_iterator
の「通常の」イテレータが必要な問題があります。たとえば、マップからすべてのキーをセットに追加したいとします。 my_set
は、単一の値、-858993460
または0xcccccccc
が含まれ、insert
後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;
}
:私は、次の短いスニペットを書きました。どうして?ループで*b
を印刷すると、すべての値が期待どおりに印刷されます。
引数 'kvp'への参照を返しました。これは参照自体であり、おそらく一時的なものです。 BTWは、 'boost :: result_of'の下に' result_type' _is_が書かれていて、 'transform_iterator'は' result_of'を使って文書化されています。 – MSalters
@MSalters:Hm、ok。私は 'result_type'のために文書を検索し、空白になりました。しかし、何を探すべきかを知っている、それはそこにある。私は読書を非常に難しくしています。たくさんのテンプレートがあり、あなたはほとんどすべての木々の森を見ることができません...とにかく、明確化のおかげで! – carlpett