8

如何从输出迭代器中擦除类型std::insert_iteratorstd::back_insert_iterator?是否可以使用 boostany_iterator来做到这一点?

#include <boost/range.hpp>
#include <boost/range/detail/any_iterator.hpp>
#include <vector>

typedef boost::range_detail::any_iterator<
    int, boost::incrementable_traversal_tag, int &, std::ptrdiff_t > It;

int main()
{
    std::vector<int> v;
    It outIt( v.begin() ); // compiles
    It inserter( std::back_inserter(v) ); // does not compile
    return 0;
}
4

2 回答 2

7

any_iterator不是为与输出迭代器一起使用而设计的,这就是back_insert_iterator(或者,就此而言,输入迭代器)。

back_insert_iterator被定义为继承自iterator<output_iterator_tag, void, void, void, void>它的value_type,reference_type和are all distance_type,但希望能够通过其支持迭代器间接指向非空值。也许它会更好地命名;但它是一个类模板。pointer_typevoidany_iteratorany_value_iteratordetail

于 2012-05-29T07:50:33.070 回答
5

所以我使用Boost实现了我自己的一个。

#include <boost/function_output_iterator.hpp>
#include <boost/function.hpp>

template < class T >
class AnyInserter : public boost::function_output_iterator< boost::function< void ( const T & value ) > >
{
private:
    typedef typename boost::function_output_iterator< boost::function< void ( const T & value ) > > BaseType;
    template < class OutIt > struct Insert
    {
        Insert( OutIt it ) : m_it(it) {}
        void operator () ( const T & value ) { m_it++ = value; }
        OutIt m_it;
    };
public:
    template < class OutIt >
        explicit AnyInserter( const OutIt & it ) : BaseType( Insert< OutIt >(it) ) {}
};

template < class OutIt >
    inline AnyInserter< typename OutIt::container_type::value_type >
    makeAnyInserter( const OutIt & it ) 
    {
        return AnyInserter< typename OutIt::container_type::value_type >(it);
    }
于 2012-05-29T10:56:50.323 回答