resetting a stringstream

resetting a stringstream

本文关键字:stringstream resetting      更新时间:2023-10-16

如何将字符串流的状态"重置"为我创建它时的状态?

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);

编辑:修复christianpartpart和Nemo报告的错误。谢谢。

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

优势:

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

:

  1. 与赋值操作符相比:当新对象在堆中有一个分配的缓冲区时,STL交换方法可以比赋值操作符更快。在这种情况下,赋值操作符必须为新对象分配缓冲区,然后可能需要为旧对象分配另一个缓冲区,然后将数据从新对象的缓冲区复制到旧对象的新缓冲区。实现快速交换是非常容易的,例如,它只是交换缓冲区的指针。

  2. c++ 11。我看到一些移动赋值操作符的实现比交换慢,虽然可以修复,但可能STL开发人员不希望留下大量数据的移动对象

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

    汽车to_return (std::移动(m_container));m_container.clear ();返回to_return;

没有比

更好的了
auto to_return;
m_container.swap(to_return);
return to_return;

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

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

基于上面的答案,我们还需要重置任何格式。在所有这些操作中,当构造一个新的std::stringstream实例时,我们将缓冲区内容、流状态标志和所有格式化都重置为默认值。

void reset(std::stringstream& stream)
{
    const static std::stringstream initial;
    
    stream.str(std::string());
    stream.clear();
    stream.copyfmt(initial);
}