首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重置字符串流

重置字符串流
EN

Stack Overflow用户
提问于 2011-10-02 07:36:41
回答 3查看 67.5K关注 0票数 96

如何将字符串流的状态“重置”到创建它时的状态?

代码语言:javascript
复制
int firstValue = 1;
int secondValue = 2;

std::wstringstream ss;

ss << "Hello: " << firstValue;

std::wstring firstText(ss.str());

//print the value of firstText here


//How do I "reset" the stringstream here?
//I would like it behave as if I had created
// stringstream ss2 and used it below.


ss << "Bye: " << secondValue;

std::wstring secondText(ss.str());

//print the value of secondText here
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-02 07:40:43

这是我通常的做法:

代码语言:javascript
复制
ss.str("");
ss.clear(); // Clear state flags.
票数 147
EN

Stack Overflow用户

发布于 2015-10-06 02:17:11

我会这么做的

代码语言:javascript
复制
std::wstringstream temp;
ss.swap(temp);

编辑:修复christianparpart和Nemo上报的错误。谢谢。

PS:上面的代码在堆栈上创建一个新的stringstream对象,并将ss中的所有内容与新对象中的内容进行交换。

优势:

  1. 它保证ss现在将处于一种全新的状态。
  2. 新对象是内联并在堆栈上创建的,这样编译器就可以轻松地优化代码。最后,这就像将所有ss内部数据重置为初始状态一样。

更多信息:

  1. 与赋值运算符的比较:在新对象在堆中具有分配的缓冲区的情况下,STL交换方法可能比赋值运算符更快。在这种情况下,赋值操作符必须为新对象分配缓冲区,然后可能需要为旧对象分配另一个缓冲区,然后将数据从新对象的缓冲区复制到旧对象的新缓冲区。这是非常容易实现一个快速交换,这只是交换缓冲区的指针为example.
  2. C++11.我见过一些实现的移动赋值运算符是慢于交换,虽然这是可以修复的,但可能STL开发人员不想离开一个移动的对象与大量的data
  3. std::move()不能保证移动的对象是空的。return std::move(m_container);不会清除m_container。所以你将不得不这样做

auto to_return(std::move(m_container));m_container.clear();return to_return;

不可能比这更好

代码语言:javascript
复制
auto to_return;
m_container.swap(to_return);
return to_return;

因为后者保证它不会复制缓冲区。

因此,只要适合我,我总是更喜欢swap()

票数 12
EN

Stack Overflow用户

发布于 2018-02-18 05:19:26

根据上面的答案,我们还需要重置任何格式。总而言之,当构造新的std::stringstream实例时,我们将缓冲区内容、流状态标志和任何格式重置为它们的默认值。

代码语言:javascript
复制
void reset(std::stringstream& stream)
{
    const static std::stringstream initial;
    
    stream.str(std::string());
    stream.clear();
    stream.copyfmt(initial);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7623650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档