2013-06-01 3 views
3

Я использую это:станд :: istringstream из станд :: строки без копирования

ifstream in("file.txt") 
string line;  
getline(in,line); 
istringstream iss(line); 
... 

для некоторого простого анализа. Я хотел бы избежать ненужного копирования для того, чтобы улучшить производительность, так что я пробовал:

ifstream in("huge_line.txt"); 
string line; 
getline(in,line); 
istringstream ss; 
ss.rdbuf()->pubsetbuf(const_cast<char*>(line.c_str()), line.size()); 
... 

и, кажется, чтобы сделать работу (значительно повысить производительность, то есть). Мой вопрос в том, насколько безопасен данный const_cast? Я имею в виду, что до тех пор, пока я работаю с istrinstream, внутренний буфер никогда не должен записываться классом istringstream, поэтому переменная ss должна оставаться в допустимом состоянии, если переменная линии действительна и неизменна, правильно ?

+0

'ss.rdbuf() -> pubsetbuf (& line.front(), line.size());' для короткой версии также позволяет избежать уродливого приведения – Xeverous

ответ

3

const_cast является безопасным, поскольку базовый буфер std::string не является const. И да, если line не истекает, а ss читается, ваша программа должна быть в порядке.

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