я бы сделал
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()
столько, сколько подходит.