std :: istringstream из std :: string без копирования

Я использовал это:

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 должна оставаться в допустимом состоянии, пока строковая переменная является действительной и неизменной, верно?

4

Решение

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

3

Другие решения

Эффект ss.rdbuf()->pubsetbuf определяется реализацией и, следовательно, не обязательно делает то, что вы ожидаете.

Таким образом, эффект вашего измененного кода не должен быть эквивалентным исходному.

0

По вопросам рекламы [email protected]