重置一个stringstream

如何将stringstream的状态“重置”到创build时的状态?

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 

我通常这样做:

 ss.str(""); ss.clear(); // Clear state flags. 

我会做

 std::wstringstream temp; ss.swap(temp); 

编辑:修正了christianparpart和Nemo报告的错误。 谢谢。

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

优点:

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

更多:

  1. 与赋值运算符相比:在新对象在堆中具有已分配缓冲区的情况下,STL交换方法可能比赋值运算符更快。 在这种情况下,赋值运算符必须为新对象分配缓冲区,那么可能需要为旧对象分配另一个缓冲区,然后将数据从新对象的缓冲区复制到旧对象的新缓冲区。 实现快速交换非常简单,例如只交换缓冲区的指针。

  2. C ++ 11。 我看到移动赋值运算符的一些实现比交换慢,虽然这可以是固定的,但可能STL开发人员不希望留下移动的对象与大量的数据

  3. std::move()不保证移动的对象被清空。 return std::move(m_container); 不清除m_container。 所以你必须这样做

    auto to_return(std :: move(m_container)); m_container.clear(); 返回to_return;

哪个不能比

 auto to_return; m_container.swap(to_return); return to_return; 

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

所以我总是喜欢swap()只要它适合。