我有一个提升:: bimap,我想迭代所有位置 将给定边的值添加到另一个STL兼容容器中。 我怎么能这样做?
我的方法是将std :: for_each与boost :: bind:
一起使用std::for_each(mybimap.left.begin(),
mybimap.left.end(),
boost::bind(&vector::push_back, &myvec,
boost::bind( ... )));
答案 0 :(得分:4)
这应该有效:
std::for_each(mybimap.left.begin(),
mybimap.left.end(),
boost::bind(&vector_type::push_back, &myvec,
boost::bind(&map_type::left_map::value_type::second, _1)));
...或者如果您指的是映射的键值而不是映射到的值,请使用first
而不是second
。
编辑:我发现这种双重绑定相当笨拙,for_each
非最佳算法(copy
会更适合,恕我直言,算法名称应该说明意图,这显然是一个副本)。你也可以在这里使用transform iterator:
std::copy(boost::make_transform_iterator(mybimap.left.begin(), select_second()),
boost::make_transform_iterator(mybimap.left.end(), select_second()),
std::back_inserter(myvec));
其中select_second
是一个选择对的第二个元素的函数对象 - 或者只是boost::bind(&map_type::left_map::value_type::second, _1)
。
对于我无法使用transform_iterator
的情况,我在工作中写了一个transform_back_inserter
,基本上是一个back_inserter
,它采用了一个应用于该元素的一元函数写作(没有火箭科学写) - 然后它看起来像
std::copy(mybimap.left.begin(),
mybimap.left.end(),
transform_back_inserter(myvec, select_second()));
我倾向于选择transform_iterator
,因为我不必重复一元函数名称。
答案 1 :(得分:1)
根据您发布的代码判断,您希望将所有内容从boost :: bimap复制到std :: vector。
试试这个:
std::copy(mybimap.left.begin(),
mybimap.left.end(),
std::back_inserter(myvec));
答案 2 :(得分:0)
请尝试&vector<your_value_type>::push_back
。