我什么时候会使用 std::istringstream , std::ostringstream 和 std::stringstream ?为什么我不应该在每个场景中使用 std::stringstream (是否存在任何运行时性能问题?) .
std::istringstream
std::ostringstream
std::stringstream
最后,这有什么不好的(而不是使用流):
std::string stHehe("Hello "); stHehe += "stackoverflow.com"; stHehe += "!";
就个人而言,我发现很少有人想要在同一个字符串流中执行流式传输 .
通常我想要从字符串初始化一个流然后解析它;或将事物流式传输到字符串流,然后提取结果并存储它 .
如果您要在同一个流中进行流式传输,则必须非常小心流状态和流位置 .
使用'just' istringstream 或 ostringstream 更好地表达了你的意图,并给你一些检查,以防止意外使用 << vs >> 等愚蠢的错误 .
istringstream
ostringstream
<<
>>
可能会有一些性能改进,但我不会先考虑那个 .
你写的东西没什么不对 . 如果你发现它表现不佳,那么你可以描述其他方法,否则坚持最清楚的方法 . 就个人而言,我只想:
std::string stHehe( "Hello stackoverflow.com!" );
stringstream 稍微大些,性能可能略低 - 多重继承可能需要调整vtable指针 . 主要区别是(至少在理论上)更好地表达您的意图,并防止您意外地使用 >> << (反之亦然) . OTOH,差异足够小,特别是对于快速的演示代码等等,我很懒,只是使用 stringstream . 我不记得上次当我打算 >> 时我意外地使用了 << ,所以对我来说,安全性似乎主要是理论上的(特别是因为如果你犯了这样的错误,它几乎总是非常明显的几乎立刻) .
stringstream
只要它完成你想要的东西,只使用一个字符串没有任何错误 . 如果你很容易并且工作正常 . 如果你想格式化其他类型的数据, stringstream 将支持它,而字符串通常不支持 .
在大多数情况下,您不会发现自己需要在同一个字符串流上同时输入和输出,因此明确使用 std::ostringstream 和 std::istringstream 可以明确您的意图 . 它还可以防止您意外键入错误的运算符( << vs >> ) .
当您需要在同一个流上执行这两个操作时,您显然会使用通用版本 .
性能问题是您最关注的问题,清晰度是主要优势 .
最后使用字符串append没有任何问题,因为你必须构造纯字符串 . 你不能用它来组合像perl这样的语言中的数字 .
istringstream用于输入,ostringstream用于输出 . stringstream是输入和输出 . 你几乎可以在任何地方使用stringstream . 但是,如果您将对象提供给另一个用户,并且它使用operator >>而您在那里等待只写对象,那么您将不会高兴;-)
PS:没什么不好的,只是性能问题 .
回答你的第三个问题:不,'s perfectly reasonable. The advantage of using streams is that you can enter any sort of value that'已经定义了 operator<< ,而你只能将字符串(C或C)添加到 std::string .
operator<<
std::string
假设只有插入或仅提取适合您的操作,您可以使用“i”或“o”前缀版本中的一个来排除不需要的操作 .
如果这不重要,那么您可以使用i / o版本 .
您显示的字符串连接完全有效 . 尽管使用stringstream连接是可能的,但这不是stringstreams最有用的功能,它能够插入和提取POD和抽象数据类型 .
例如,如果您只需要从中读取文件,为什么要打开文件进行读/写访问?
如果需要从同一个文件读取多个进程怎么办?
7 回答
就个人而言,我发现很少有人想要在同一个字符串流中执行流式传输 .
通常我想要从字符串初始化一个流然后解析它;或将事物流式传输到字符串流,然后提取结果并存储它 .
如果您要在同一个流中进行流式传输,则必须非常小心流状态和流位置 .
使用'just'
istringstream
或ostringstream
更好地表达了你的意图,并给你一些检查,以防止意外使用<<
vs>>
等愚蠢的错误 .可能会有一些性能改进,但我不会先考虑那个 .
你写的东西没什么不对 . 如果你发现它表现不佳,那么你可以描述其他方法,否则坚持最清楚的方法 . 就个人而言,我只想:
stringstream
稍微大些,性能可能略低 - 多重继承可能需要调整vtable指针 . 主要区别是(至少在理论上)更好地表达您的意图,并防止您意外地使用>>
<<
(反之亦然) . OTOH,差异足够小,特别是对于快速的演示代码等等,我很懒,只是使用stringstream
. 我不记得上次当我打算>>
时我意外地使用了<<
,所以对我来说,安全性似乎主要是理论上的(特别是因为如果你犯了这样的错误,它几乎总是非常明显的几乎立刻) .只要它完成你想要的东西,只使用一个字符串没有任何错误 . 如果你很容易并且工作正常 . 如果你想格式化其他类型的数据,
stringstream
将支持它,而字符串通常不支持 .在大多数情况下,您不会发现自己需要在同一个字符串流上同时输入和输出,因此明确使用
std::ostringstream
和std::istringstream
可以明确您的意图 . 它还可以防止您意外键入错误的运算符(<<
vs>>
) .当您需要在同一个流上执行这两个操作时,您显然会使用通用版本 .
性能问题是您最关注的问题,清晰度是主要优势 .
最后使用字符串append没有任何问题,因为你必须构造纯字符串 . 你不能用它来组合像perl这样的语言中的数字 .
istringstream用于输入,ostringstream用于输出 . stringstream是输入和输出 . 你几乎可以在任何地方使用stringstream . 但是,如果您将对象提供给另一个用户,并且它使用operator >>而您在那里等待只写对象,那么您将不会高兴;-)
PS:没什么不好的,只是性能问题 .
回答你的第三个问题:不,'s perfectly reasonable. The advantage of using streams is that you can enter any sort of value that'已经定义了
operator<<
,而你只能将字符串(C或C)添加到std::string
.假设只有插入或仅提取适合您的操作,您可以使用“i”或“o”前缀版本中的一个来排除不需要的操作 .
如果这不重要,那么您可以使用i / o版本 .
您显示的字符串连接完全有效 . 尽管使用stringstream连接是可能的,但这不是stringstreams最有用的功能,它能够插入和提取POD和抽象数据类型 .
例如,如果您只需要从中读取文件,为什么要打开文件进行读/写访问?
如果需要从同一个文件读取多个进程怎么办?