1

_pimpl->_connections是一个std::map所以它的元素是std::pair<KeyType, gcl::SectionConnectionT*>我想使用一个谓词gcl::SectionConnectionT::NotConnectedTo(r)来过滤掉不必要的值。但如果我使用

std::remove_copy_if(it_pair.first, it_pair.second, std::back_inserter(sectionConnections), gcl::SectionConnectionT::NotConnectedTo(r));

它尝试将 插入pair向量中。但是向量的类型是<gcl::SectionConnectionT*>一些谷歌搜索带我去的地方transform_iterator,我无法理解如何理解。我是这样用的。但得到编译错误

std::pair<CollectionT::iterator, CollectionT::iterator> it_pair = _pimpl->_connections.equal_range(l);
std::vector<gcl::SectionConnectionT*> sectionConnections;
std::remove_copy_if(it_pair.first, it_pair.second, boost::make_transform_iterator(std::back_inserter(sectionConnections), util::shorthand::pair_second()), gcl::SectionConnectionT::NotConnectedTo(r));
4

1 回答 1

1

Boost.Iterator 库可能无法推断 的返回类型until::shorthand::pair_second::operator()(CollectionT::value_type&) const,因此返回transform_iterator的不是可写左值迭代器概念建模,因为它需要用于std::remove_copy_if(输出迭代器)的第三个参数。

但是,以下工作:

//#include <boost/lambda/bind.hpp>
//#include <boost/lambda/lambda.hpp>
//#include <boost/range/adaptor/map.hpp>
//#include <boost/range/algorithm/remove_copy_if.hpp>

//namespace gcl {
//struct SectionConnectionT {
//    bool NotConnectedTo(RType r) const;
//    // ...
//};
//}

boost::remove_copy_if(it_pair | boost::adaptors::map_values,
    std::back_inserter(sectionConnections),
    boost::lambda::bind(&gcl::SectionConnectionT::NotConnectedTo, boost::lambda::_1, r));
于 2012-08-19T22:01:51.877 回答