采用back_inserter以使用Boost迭代器采用器从MAP插入到列表中

adopt back_inserter to insert to list from map using boost iterator adopters

本文关键字:MAP 插入 列表 迭代器 back inserter Boost 采用      更新时间:2023-10-16
std::copy(map.begin(), map.end(), std::back_inserter(list))这就是

我想要实现的..从地图到列表i->second项目。是否有任何可以使用的提升迭代器采用器?

我以为transform_iterator会起作用。 这就是我试图做的事情。

std::map<int, std::string> map;
std::list<std::string>     list;
std::copy(
    boost::make_transform_iterator(map.begin(), 
        boost::bind(&std::pair<int, std::string>::second, _1)), 
    boost::make_transform_iterator(map.end(), 
        boost::bind(&std::pair<int, std::string>::second, _1)),
    std::back_inserter(list));

我实际上是在std::set_intersection上申请 这不将函子作为函数参数 所以我不能使用 std::transform 并传递函数。(附上实际代码)

typedef std::map<khut::point::value_type, khut::diagonal> storage_type;
storage_type repo_begining;
storage_type repo_ending;
storage_type::const_iterator lower_it = repo_begining.lower_bound(diagonal.begining().y());
storage_type::const_iterator upper_it = repo_ending.lower_bound(diagonal.ending().y());
std::list<khut::diagonal> diagonals_intersecting;
std::set_intersection(lower_it, repo_begining.end(), repo_ending.begin(), upper_it, std::back_inserter(diagonals_intersecting));

注意:我无法使用 C++11

问题出在value_type 中。 std::map<int, std::string>::value_type不是std::pair<int, std::string>而是std::map<const int, std::string> 所以一旦我将代码更改为

std::copy(
    boost::make_transform_iterator(map.begin(), 
        boost::bind(&std::pair<const int, std::string>::second, _1)), 
    boost::make_transform_iterator(map.end(), 
        boost::bind(&std::pair<const int, std::string>::second, _1)),
    std::back_inserter(list));

成功了