std :: stringstream.str()总是返回相同的字符串?

时间:2015-09-29 11:07:45

标签: c++

创建std::stringstream并用数据填充时,只要流不再更改,我可以依赖返回的相同字符串对象吗?

为了说明我的意思,请考虑以下示例:

std::stringstream ss;

ss << value1;
ss << value2;
...

std::vector<char> data(ss.str().begin(), ss.str().end());

现在,在向量被填充的情况下,这是有效还是stringstream总是会创建一个新的字符串对象?

这样做会更好/更安全/更正,还有额外的复制操作吗?

std::string s = ss.str();
std::vector<char> data(s.begin(), s.end());

2 个答案:

答案 0 :(得分:4)

The documentation是你的朋友。使用它!

std::basic_stringstream::str()按值返回(即副本),所以你所做的并不安全。

您可以在示例中创建自己的本地(并依赖于RVO),或者您可以将结果绑定到ref-to - const

const std::string& s = ss.str();
std::vector<char> data(s.begin(), s.end());

答案 1 :(得分:3)

你的第二次尝试是正确的(如果我们使用字符串流,你可能真的做得最好)。

至于第一次尝试...... 据我所知,这是无效的。 这个网站http://www.cplusplus.com/reference/sstream/stringstream/str/ 表示:

string str() const;

这意味着它按值返回一个新字符串。

如果它返回一个字符串&amp;,你就可以逃脱它。

你也问过 “那么这样做会更好/更安全/更正,还有额外的复制操作吗?”

但你可能忽略了这样一个事实:“ss.str”调用每次都会分配一个新的字符串。

遗憾的是,没有明显的方法可以从字符串流中获取向量(不通过字符串)。