创建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());
答案 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”调用每次都会分配一个新的字符串。
遗憾的是,没有明显的方法可以从字符串流中获取向量(不通过字符串)。