2012-05-13 2 views
3

boost関数make_function_output_iteratorは、std :: for_eachに適した関数をstd :: copyに適したイテレータに変換します。その逆を行うブースト機能はありますか?つまり、std :: copyに適したイテレータをとり、std :: for_eachに適した関数に変換します。boost :: make_function_output_iteratorの逆

出力イテレータoutput_iterがある場合。私は、あなたが探しているもの

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

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

私はよく分かりません。 2つはかなり異なるものです。 'std :: for_each'からの出力はまったくありません。おそらく、あなたはhttp://www.sgi.com/tech/stl/back_insert_iterator.htmlか 'std :: transform'を探していますか?おそらく最初のケースの例と、2番目のケースに必要なものを示す疑似例を追加できますか? – Flexo

答えて

1

たぶんstd::insert_iteratorまたはstd::transformと同じことを行うにはされている必要がありますか?

あなたは、いくつかのboost::bind魔術で、すべての呼び出しの挿入をしている、std::insert_iterator::operator=をバインドすることができます。

#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)); 
} 
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)); 
+1

イテレータが(例えば)単なるポインタであれば、これは動作しませんか?出力イテレータは、私が思った一般的なケースの間にインクリメントされる必要があります。 – Flexo

+0

@awoodlandあなたは正しいです。 + +は標準コンテナでは無視されますが、std :: copyは生ポインタに対しても機能するはずです。 –

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を使用する方が理にかなって!

関連する問題