Подтвердить что ты не робот

Сброс строкового потока

Как я "reset" состояние stringstream в том, что было, когда я его создал?

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
4b9b3361

Ответ 1

Так я обычно это делаю:

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

Ответ 2

Я бы сделал

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

Изменить: исправлена ​​ошибка, сообщаемая christianparpart и Nemo. Спасибо.

PS: приведенный выше код создает новый стековый объект в стеке и свопит все в ss с элементами нового объекта.

Преимущества:

  • Он гарантирует, что ss теперь будет в новом состоянии.
  • Новый объект создается встроенным и в стеке, поэтому компилятор может легко оптимизировать код. В конце это будет похоже на сброс всех внутренних данных ss в исходное состояние.

Подробнее:

  • По сравнению с оператором присваивания: методы замены STL могут быть быстрее, чем оператор присваивания в случаях, когда новый объект имеет выделенный буфер в куче. В таком случае оператор присваивания должен выделять буфер для нового объекта, тогда ему может потребоваться выделить другой буфер для старого объекта, а затем скопировать данные из нового объектного буфера в новый буфер нового объекта. Очень легко реализовать быструю свопинг, которая просто свопирует указатели буферов, например.

  • С++ 11. Я видел некоторую реализацию оператора присваивания перемещения, который медленнее, чем swap, хотя это может быть исправлено, но, вероятно, разработчик STL не захочет оставлять перемещенный объект с большим количеством данных

  • std::move() не гарантирует, что перемещенный объект будет опустошен. return std::move(m_container); не очищает m_container. Так что вам придется делать

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

Что не может быть лучше, чем

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

потому что последний гарантирует, что он не будет копировать буферы.

Поэтому я всегда предпочитаю swap(), пока он подходит.