私はします
std::wstringstream temp;
ss.swap(temp);
編集:christianparpartとNemoによって報告されたエラーを修正しました。ありがとう。
PS:上記のコードは、スタック上に新しいstringstreamオブジェクトを作成し、すべてをss
新しいオブジェクト内のオブジェクトと交換します。
利点:
- これにより
ss
、新しい状態になることが保証されます。
- 新しいオブジェクトはインラインおよびスタック上に作成されるため、コンパイラーはコードを簡単に最適化できます。最後に、すべての
ss
内部データを初期状態にリセットするようなものになります。
もっと:
代入演算子との比較:新しいオブジェクトのヒープにバッファが割り当てられている場合、STLスワップメソッドは代入演算子よりも高速になる可能性があります。このような場合、代入演算子は新しいオブジェクトにバッファを割り当てる必要があり、次に古いオブジェクトに別のバッファを割り当ててから、新しいオブジェクトのバッファから古いオブジェクトの新しいバッファにデータをコピーする必要がある場合があります。たとえば、バッファのポインタをスワップするだけの高速スワップを実装するのは非常に簡単です。
C ++ 11。修正は可能ですが、スワップよりも遅いムーブ代入演算子の実装を見てきましたが、おそらくSTL開発者は、移動されたオブジェクトに大量のデータを残したくないでしょう。
std::move()
移動したオブジェクトが空になることを保証するものではありません。return std::move(m_container);
m_containerをクリアしません。だからあなたはしなければならないでしょう
自動to_return(std :: move(m_container)); m_container.clear(); to_returnに戻る;
これより良いことはできません
auto to_return;
m_container.swap(to_return);
return to_return;
後者はバッファをコピーしないことを保証するからです。
だから私はswap()
それが収まる限り常に好む。