3

ブースト関数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);
4

3 に答える 3

1

オプションがある場合は、ラムダではなくラムダでこれを行いますstd/boost::bind。例:

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

もちろんstd::copy、最初から使用する方が理にかなっています。

于 2012-05-13T20:38:23.960 に答える
1

たぶんstd::insert_iterator、またはstd::transformあなたが探しているものですか?

std::insert_iterator::operator=呼び出しごとに挿入を行う bind を、いくつかの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));
}
于 2012-05-13T17:36:15.767 に答える
1

クラス

 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));
于 2012-05-13T20:37:39.180 に答える