升压的反转::make_function_output_iterator

inverse of boost::make_function_output_iterator

本文关键字:function output iterator make      更新时间:2023-10-16

boost 函数make_function_output_iterator将适用于 std::for_each 的函数转换为适用于 std::copy 的迭代器。 有没有相反的升压功能。 也就是说,采用适用于 std::copy 的迭代器,并将其转换为适用于 std::for_each 的函数。

因此,如果我有一个输出迭代器output_iter。 我需要

for_each(v1.begin(), v1.end(), make_output_iterator_function(output_iter));

做同样的事情

copy(v1.begin(), v1.end(), output_iter);

也许您正在寻找std::insert_iteratorstd::transform

你可以绑定std::insert_iterator::operator=,它会在每次调用时插入一些boost::bind巫术:

#include <boost/bind.hpp>
#include <vector>
#include <iterator>
#include <algorithm>
    typedef std::vector<int> Container;
    typedef std::insert_iterator< Container > InsertIt;
int main(){
    Container v1, v2;
    InsertIt insert_it (v2,v2.end());
    std::for_each(v1.begin(), v1.end(),
            boost::bind(static_cast<InsertIt& (InsertIt::*)(typename Container::const_reference)>(&InsertIt::operator=), insert_it, _1));
}

如果你有选择,我会用 lambda 而不是 std/boost::bind 来做这件事,例如:

std::vector<type> v1;
std::for_each(v1.begin(), v1.end() [&output_iter](const type& t) {*output_iter++ = t});

当然,首先只使用std::copy会更有意义!

The class

 template<typename T>
 struct iterator_to_function {
      T iter_;
      iterator_to_function(const T& iter) : iter_(iter) {}
      template<typename T2>
      T& operator()(const T2& elem) {*iter_=elem; return ++iter_;}
 };
template<class T>
iterator_to_function<T> make_iterator_function(const T& iter) 
{
  return iterator_to_function<T>(iter);
}

将输出迭代器转换为一元函数。

typedef vector<int> t_vec;
t_vec v;
t_vec v2;
for_each(v.begin(), v.end(), 
         make_iterator_function(back_inserter(v2));