istringstream,ostringstream和stringstream有什么区别? /为什么不在任何情况下使用stringstream?
我什么时候会使用std::istringstream
, std::ostringstream
和std::stringstream
,为什么不应该在每个场景中使用std::stringstream
(是否有任何运行时性能问题?
最后,有什么不好的(而不是使用stream):
std::string stHehe("Hello "); stHehe += "stackoverflow.com"; stHehe += "!";
就我个人而言,我觉得我很less想要执行stream入和stream出相同的stringstream。
通常我想要从一个string初始化一个stream,然后parsing它; 或者将某些东西stream式传输到stringstream中,然后提取结果并存储起来。
如果你正在stream入和stream出同一个stream,你必须非常小心stream的状态和stream的位置。
使用' istringstream
或者ostringstream
更好地expression你的意图,并且可以检查一些愚蠢的错误,比如意外地使用<<
vs >>
。
有可能会有一些性能改善,但我不会首先看。
你写的东西没有错。 如果发现效果不好,那么你可以分析其他方法,否则坚持最清楚。 就我个人而言,我只是想:
std::string stHehe( "Hello stackoverflow.com!" );
一个stringstream
比较大,性能可能稍低 – 多重inheritance可能需要调整vtable指针。 主要区别在于(至less在理论上)更好地expression了您的意图,并防止您意外地使用>>
(或反之亦然)。 OTOH,差别是足够小,尤其是对于快速演示代码等等,我很懒,只是使用stringstream
。 我不记得最后一次意外使用<<
当我打算<<
时候,所以对我而言,这一点安全似乎主要是理论上的(特别是如果你犯了这样一个错误,几乎总是会变得非常明显立即)。
只要使用一个string,没有任何问题,只要它能完成你想要的。 如果你只是把string放在一起,这很容易,工作正常。 如果你想格式化其他types的数据,一个stringstream
将支持,而一个string大多不会。
在大多数情况下,你不会在同一个stringstream上同时需要input和输出,所以使用std::ostringstream
和std::istringstream
明确地expression了你的意图。 它也可以防止你意外地input错误的操作符( <<
vs >>
)。
当你需要在同一个stream上执行两个操作时,你显然会使用通用版本。
性能问题将是您在这方面最担心的问题,清晰度是主要的优势。
最后,使用string追加没有任何问题,因为您必须构build纯string。 你不能用它来像perl这样的语言结合数字。
istringstream是input,ostringstream是输出。 stringstream是input和输出。 你可以在任何地方使用stringstream。 然而,如果你把你的对象给另一个用户,并且它使用操作符>>而在等待只写对象的地方,你将不会高兴;-)
PS:没什么不好的,只是性能问题。
回答你的第三个问题:不,这是完全合理的。 使用stream的优点是可以input任何types的具有operator<<
定义的operator<<
的值,而只能将string(C ++或C)添加到std::string
。
假定只有插入或只有提取适合您的操作,您可以使用“i”或“o”前缀之一来排除不需要的操作。
如果这不重要,那么你可以使用I / O版本。
你显示的string连接是完全有效的。 虽然使用stringstream进行连接是可能的,但这并不是stringstreams最有用的function,可以插入和提取POD和抽象数据types。
为什么打开一个文件进行读/写访问,如果你只需要从它读取,例如?
如果多个进程需要从同一个文件读取呢?