2012-03-19 4 views
1

Я использую boost :: iostream lib, чтобы обернуть трубку posix в gnuplot. Для передачи двоичных данных в инлайн GNUPLOT, я в настоящее время делать что-то вроде этогоunformatted поток input from std :: vector <double>

std::vector<double> d = test_data(); 
Gnuplot plt; //custom gnuplot class derived from boost::iostream::stream 

plt << "plot '-' binary format='%double' notitle\n" 
plt.write((char*)(&c.front()), sizeof(double)*c.size()); // send binary data 

Это работает, но я хотел бы, чтобы избавиться от .WRITE и использовать интерфейс итератора, чтобы, например, std :: list в качестве источника. Я знаю, что std :: ostreambuf_iterator допускает неформатированный ввод, но просто использование std :: copy явно не работает.

+0

Дело в том, что это просто не * работа * с любой контейнер, но в 'VECTOR', так как вы просто записывая смежный диапазон памяти независимо от типа объекта. Однако обертка на основе итератора тривиальна для записи. –

ответ

2

Вот наивный шаблон обертку выписывать диапазоны:

#include <memory> 
#include <iterator> 

template <typename FwdIter> 
write_range(Gnuplot & gp, FwdIter it, FwdIter end) 
{ 
    typedef typename std::iterator_traits<FwdIter>::value_type type; 
    for (; it != end; ++it) 
    { 
     gp.write(reinterpret_cast<char const *>(std::addressof(*it)), sizeof(type)); 
    } 
} 

Использование: write_range(gp, mylist.begin(), mylist.end());

Смежные вопросы