通常有人会去抓住Boost的Function Output Iterator,但我不允许在工作中使用Boost。也就是说,我只想使用copy
函数遍历集合,在每个项目上调用函数,获取该函数的输出,最后push_back
到另一个集合。我写了一些代码:
#include <iterator>
using std::iterator;
using std::output_iterator_tag;
template<typename Container, typename Function>
struct Back_Transform_Iterator : public iterator<output_iterator_tag,void,void,void,void>{
explicit Back_Transform_Iterator(Container &_container, const Function &_function)
: m_Container(_container),
m_Function(_function){}
Back_Transform_Iterator<Container,Function>& operator= (const typename Function::argument_type &value){
m_Container.push_back( m_Function( value ) );
return *this;
}
Back_Transform_Iterator<Container,Function>& operator* (){ return *this; }
Back_Transform_Iterator<Container,Function>& operator++ (){ return *this; }
Back_Transform_Iterator<Container,Function> operator++ (int){ return *this; }
typedef Container container_type;
private:
Container &m_Container;
Function m_Function;
};
template<typename C, typename F>
Back_Transform_Iterator<C,F> back_transform_inserter(C &_container, F &_unary_function){
return Back_Transform_Iterator<C,F>( _container, _unary_function );
}
但是......我遇到了编译问题。相当肯定它与operator*()
电话有关。我不知道如何有效地取消引用容器的对象,以便它们反对函数的效果。错误:
error C2582: 'operator =' function is unavailable in 'Back_Transform_Iterator<Container,Function>'
我正在迭代的项目不可变。有谁知道如何解决这个问题?
答案 0 :(得分:5)
您可以改为使用transform
:
transform(src.begin(), src.end(), back_inserter(container), func);
请注意,在引用类型上应用的const
是无操作。因此,如果argument_type
为T&
,那么说const argument_type
不会再次返回const T&
而是T&
。因此,如果您的源项是常量,那么在operator=
是引用的情况下,您会尝试将它们绑定到argument_type
的非const引用参数:
typedef int &intr;
const intr& a = 0; // fails - "const" is ignored!