不复制地从std :: string创建std :: istringstream

5

我一直在使用这个:

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是否安全? 我的意思是,只要我使用istringstream,内部缓冲区就不应该被istringstream类写入,所以只要line变量有效且未修改,ss变量就应该保持在有效状态,对吗?


1
ss.rdbuf()->pubsetbuf(&line.front(), line.size()); 的简短版本,也避免了丑陋的转换。 - Xeverous
我想知道为什么 istringstream 没有一个从字符串移动的构造函数。 - M.M
2个回答

4

const_cast 是安全的,因为 std::string 的底层缓冲区不是 const。只要在从 ss 中读取时 line 不过期,您的程序就应该没问题。


-1

ss.rdbuf()->pubsetbuf 的效果是由实现定义的,因此不一定会产生您期望的结果。

因此,您修改后的代码的效果不需要与初始代码等价。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接