2012-05-13 41 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

我不太明白。兩者是完全不同的東西。根本沒有'std :: for_each'的輸出。也許你正在尋找:http://www.sgi.com/tech/stl/back_insert_iterator.html或'std :: transform'?你可以添加一個第一個案例的例子和一個僞示例來顯示你想要的第二個案例? – Flexo

回答

1

也許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)); 
} 
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

如果你有我有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中!