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子类?
使用istringstream不是一个令人满意的解决方案,因为这会复制整个缓冲区.
之前的回答建议弃用istrstream,但由于这会生成警告并且将来可能会被删除,更好的解决方案是使用boost :: iostreams:
boost::iostreams::stream<boost::iostreams::array_source> stream(moo.c_str(), moo.size());
Run Code Online (Sandbox Code Playgroud)
这样可以避免以相同的方式复制缓冲区istrstream,并且可以节省您编写自己的流类的麻烦.
编写一个std::streambuf从给定内存区域读取的基本类是相当简单的。然后,您可以从中构造一个istream并从中读取。
从内存缓冲区初始化 C++ std::istringstream?
请注意,指向的缓冲区的生命周期c_str()非常有限,c_str()虽然我不知道它的任何实现,但不能保证对want的调用会导致一些复制。