我什么时候会使用std::istringstream
,std::ostringstream
和std::stringstream
?为什么不能在任何情况下都只使用std::stringstream
(是否存在运行时性能问题?)。
最后,对于这种情况(而不是根本不使用流),有什么不好的地方吗:
std::string stHehe("Hello ");
stHehe += "stackoverflow.com";
stHehe += "!";
我什么时候会使用std::istringstream
,std::ostringstream
和std::stringstream
?为什么不能在任何情况下都只使用std::stringstream
(是否存在运行时性能问题?)。
最后,对于这种情况(而不是根本不使用流),有什么不好的地方吗:
std::string stHehe("Hello ");
stHehe += "stackoverflow.com";
stHehe += "!";
std::string stHehe( "Hello stackoverflow.com!" );
stringstream
大小稍微大一些,速度可能略低 -- 多重继承可能需要调整vtable指针。主要区别是(至少在理论上)更好地表达你的意图,并防止你不小心使用 >>
代替 <<
(或者反之亦然)。但另一方面,这种差异非常小,特别是对于快速演示代码等,我通常会懒惰地只使用 stringstream
。我几乎记不起上一次不小心使用了 <<
当我本意是用 >>
时,所以对我来说,这种安全性大多数是理论性的(特别是因为如果你确实犯了这样的错误,它几乎总是很明显的)。stringstream
就可以支持,而字符串就不能完全胜任。在大多数情况下,您不需要在同一个stringstream上同时使用输入和输出,因此显式地使用 std::ostringstream
和 std::istringstream
可以使您的意图更加清晰。这还可以防止您意外输入错误的运算符(<<
与 >>
)。
当您需要对同一流执行两个操作时,您将使用通用版本。
性能问题在这里是您最不用担心的事情,清晰度是主要优点。
最后,使用字符串附加作为构造纯字符串的方法没有问题。但与perl等语言中的方式不同,您无法使用它来组合数字。
istringstream 用于输入,ostringstream 用于输出。stringstream 可以输入和输出。 你几乎可以在任何地方使用 stringstream。 但是,如果您将您的对象交给另一个用户,并且它使用了 operator >>,而您期望的是一个只写对象,那么您会感到不满意;-)
PS: 对此没有什么不好的,只是性能问题。
std::ostringstream::str() 函数会创建一个流内容的副本,在某些情况下会导致内存使用量加倍。为避免此问题,您可以使用 std::stringstream 和它的 rdbuf() 函数。
更多细节请参考:如何将 ostringstream 直接输出到 cout?
假设只有插入或提取适用于您的操作,您可以使用其中一个'i'或'o'前缀版本来排除不需要的操作。
如果这不重要,那么您可以使用i/o版本。
您展示的字符串连接是完全有效的。虽然使用stringstream进行连接是可能的,但这不是stringstream最有用的功能,其最有用的功能是能够插入和提取POD和抽象数据类型。