非复制istringstream

kam*_*iro 11 c++ istream istringstream

因此istringstream,在初始化时复制字符串的内容,例如

string moo("one two three four");
istringstream iss(moo.c_str());
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法std::istringstream使用给定c_str的缓冲区而不复制东西.这样,在传递std::istringstream&istream&作为参数的函数之前,它不必复制大量内存.

我一直在努力做的是转换一些只接受std::ifstream&参数的函数(它们主要是解析器)istream&.我是否必须为此创建自己的istream子类?

Rio*_*iot 6

使用istringstream不是一个令人满意的解决方案,因为这会复制整个缓冲区.

之前的回答建议弃用istrstream,但由于这会生成警告并且将来可能会被删除,更好的解决方案是使用boost :: iostreams:

boost::iostreams::stream<boost::iostreams::array_source> stream(moo.c_str(), moo.size());
Run Code Online (Sandbox Code Playgroud)

这样可以避免以相同的方式复制缓冲区istrstream,并且可以节省您编写自己的流类的麻烦.


CB *_*ley 5

编写一个std::streambuf从给定内存区域读取的基本类是相当简单的。然后,您可以从中构造一个istream并从中读取。

从内存缓冲区初始化 C++ std::istringstream?

请注意,指向的缓冲区的生命周期c_str()非常有限,c_str()虽然我不知道它的任何实现,但不能保证对want的调用会导致一些复制。