сброс потока строк - PullRequest
       6

сброс потока строк

75 голосов
/ 02 октября 2011

Как мне "сбросить" состояние потока строк до того, что было, когда я его создал?

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

Ответы [ 3 ]

122 голосов
/ 02 октября 2011

Я обычно так делаю:

ss.str("");
ss.clear(); // Clear state flags.
6 голосов
/ 05 октября 2015

Я бы сделал

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

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

PS: Приведенный выше код создает новый объект stringstream в стеке и заменяет все в ss на все в новом объекте.

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

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

Подробнее:

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

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

  3. 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(), пока оно подходит.

1 голос
/ 18 февраля 2018

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

...