OSTRINGSTREAM,.STR(),并重置/清除流

ostringstream, .str(), and reseting/clearing the stream

本文关键字:清除 STR OSTRINGSTREAM      更新时间:2023-10-16

我正在使用std:oststream和-std = c 11?的内存错误舔伤口,我有一个相关的问题。

如果以下返回临时性,则reserve没有效果,并且char*无效:

ostringstream oss;
oss.str().reserve(96);
// populate oss
const char* ptr = oss.str().c_str();
// do something with ptr

那么,以下如何清除ostringstream(如何重复使用OSTRINGSTREAM?):

oss.clear(); oss.str("");

我了解clear()将重置流的标志;但是,正如我现在现在了解str("")将在临时而不是基础字符串上运行。

那么str("")如何重置流?

这些都是不同的功能。

oss.str()(无参数)将副本返回到流的基础字符串中,但是 oss.str("") sets 将其基础字符串返回到您传递的值(这里是一个空字符串: "")。

因此,在std::stringstream上同时调用clear()str("")实际上是"重置" IT。

请注意cppreference上的两个签名

无参数调用 str返回内部字符串对象的副本。这就是为什么它是一个临时对象。使用字符串参数调用str设置内部字符串对象的值。它在临时对象上不起作用。

似乎您是这样想的:

oss.str() = "";

,但这不是。您正在将""传递给str函数,以便它可以分配给内部字符串。

它与任何其他Getter/Setter组合都没有什么不同。如果您有getX(),则通常会为您提供您打电话给的某些类成员的副本。如果您有setX(x),则通常设置该成员的值。在这种情况下,它们既称为str,但是一个参数,另一个则没有。

来自此std::ostringstream::str参考:

参数

new_str - 基础字符串的新内容

它可用于获取字符串,也可以用于 set 函数参数提供的字符串。