Использование внешнего буфера для stringstream
От: Аноним  
Дата: 14.05.12 09:11
Оценка:
Коллеги, приветствую

Если нужно отформатировать в строку большой объем данных с помощью stringstream, это приводит к постоянным реаллокациям.
Т.к. stringstream.str() возвращает копию строки, так что reserve() сделать не получится.

Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).
Re: Использование внешнего буфера для stringstream
От: zaufi Земля  
Дата: 14.05.12 09:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Коллеги, приветствую


А>Если нужно отформатировать в строку большой объем данных с помощью stringstream, это приводит к постоянным реаллокациям.

А>Т.к. stringstream.str() возвращает копию строки, так что reserve() сделать не получится.

А>Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).


написать свой streambuf (наследник стандартного) и подсовывать его при создании stringstream
Re: Использование внешнего буфера для stringstream
От: Vamp Россия  
Дата: 14.05.12 13:38
Оценка:
А>Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).
Если все равно есть желание использовать статический массив, то рекомендую старый (не)добрый snprintf.
Да здравствует мыло душистое и веревка пушистая.
Re: Использование внешнего буфера для stringstream
От: MaximE Великобритания  
Дата: 14.05.12 19:19
Оценка: 4 (1)
Здравствуйте, Аноним, Вы писали:

А>Коллеги, приветствую


А>Если нужно отформатировать в строку большой объем данных с помощью stringstream, это приводит к постоянным реаллокациям.

А>Т.к. stringstream.str() возвращает копию строки, так что reserve() сделать не получится.

А>Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).


char buf[0x1000];
std::stringstream ss;
ss.rdbuf()->pubsetbuf(buf, sizeof buf);
ss << "abc"; // пишется в buf
// ...
// скопировать buf в строку
std::string buf_contents(buf, ss.tellg()); // в buf записали tellg() байт
Re[2]: Использование внешнего буфера для stringstream
От: cNoNim Россия http://cnonim.name
Дата: 01.08.12 21:11
Оценка:
Здравствуйте, MaximE, Вы писали:
ME>
ME>char buf[0x1000];
ME>std::stringstream ss;
ME>ss.rdbuf()->pubsetbuf(buf, sizeof buf);
ME>ss << "abc"; // пишется в buf
ME>// ...
ME>// скопировать buf в строку
ME>std::string buf_contents(buf, ss.tellg()); // в buf записали tellg() байт
ME>


эм... для VS2010 не работает
Re: Использование внешнего буфера для stringstream
От: Хон Гильдон Россия  
Дата: 02.08.12 08:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Если нужно отформатировать в строку большой объем данных с помощью stringstream, это приводит к постоянным реаллокациям.

А>Т.к. stringstream.str() возвращает копию строки, так что reserve() сделать не получится.

А>Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).


Устаревший strstream кое-что на эту тему умел (за что и поплатился). А вообще, какие проблемы реализовать свой стрим (вернее, стримбуф)? С boost::iostreams это делается с полпинка.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: Использование внешнего буфера для stringstream
От: sts  
Дата: 02.08.12 17:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Коллеги, приветствую


А>Если нужно отформатировать в строку большой объем данных с помощью stringstream, это приводит к постоянным реаллокациям.

А>Т.к. stringstream.str() возвращает копию строки, так что reserve() сделать не получится.

А>Есть ли путь (кроме конечно реализации своей версии stringstream) резервировать данные под буфер при создании или в идеале использовать внешний статический массив (пускай пока очищать его придется вручную).


#include <ostream>
#include <boost/iostreams/filtering_stream.hpp>
int main()
{
    char buf[1000] = {};
    boost::iostreams::filtering_ostream out( boost::make_iterator_range(buf, buf + sizeof buf));
    out << "12345" << std::endl;
    std::cout << buf;
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.