сброс струнного потока


Как мне "сбросить" состояние 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
3 63

3 ответа:

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

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

Я бы сделал

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

Edit: Исправлена ошибка, сообщенная 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.четкий(); возвращение to_return;

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

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

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

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

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

void reset(std::strinstream& stream)
{
    const static std::stringstream initial;

    stream.str(std::string());
    stream.clear();
    stream.copyfmt(initial);
}