Как мне «сбросить» состояние строкового потока до того, каким оно было при его создании?
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
c++
string
stringstream
user974967
источник
источник
clear
, не сбрасывает манипуляторы io. Пример неудачного теста: std :: stringstream ss; ss << "Привет" << std :: setw (15) << "Мир" << std :: setw (15); сбросить (сс); ss << "Hello World"; assert ("Привет, мир" == buf.str ()); // терпит неудачу, берет последний std ::я бы сделал
std::wstringstream temp; ss.swap(temp);
Изменить: исправлена ошибка, о которой сообщили christianparpart и Nemo. Спасибо.
PS: Приведенный выше код создает новый объект строкового потока в стеке и меняет местами все, что
ss
есть в новом объекте.Преимущества:
ss
что теперь будет в свежем-новом состоянии.ss
внутренних данных в исходное состояние.Больше:
По сравнению с оператором присваивания: методы подкачки STL могут быть быстрее, чем оператор присваивания, в тех случаях, когда новый объект имеет выделенный буфер в куче. В таком случае оператор присваивания должен выделить буфер для нового объекта, затем МОЖЕТ потребоваться выделить другой буфер для старого объекта, а затем скопировать данные из буфера нового объекта в новый буфер старого объекта. Очень легко реализовать быструю подкачку, например, просто поменять местами указатели буферов.
С ++ 11. Я видел некоторую реализацию оператора присваивания перемещения, которая работает медленнее, чем своп, хотя это можно исправить, но, вероятно, разработчик STL не захочет оставлять перемещенный объект с большим количеством данных
std::move()
не гарантирует, что перемещенный объект опустеет.return std::move(m_container);
не очищает m_container. Так что тебе придется сделатьавто to_return (std :: move (m_container)); m_container.clear (); return 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); }
источник