web-dev-qa-db-ja.com

文字列ストリームのリセット

文字列ストリームの状態を作成時の状態に「リセット」するにはどうすればよいですか?

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
75
user974967

これは私が通常行う方法です:

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

私はやります

_std::wstringstream temp;
ss.swap(temp);
_

編集:christianparpartとNemoによって報告されたエラーを修正しました。ありがとう。

PS:上記のコードは、スタック上に新しいstringstreamオブジェクトを作成し、ss内のすべてを新しいオブジェクト内のものと交換します。

利点:

  1. ssが新しい状態になることを保証します。
  2. 新しいオブジェクトはインラインおよびスタック上に作成されるため、コンパイラはコードを簡単に最適化できます。最後に、すべてのss内部データを初期状態にリセットするようなものになります。

もっと:

  1. 代入演算子と比較して、STLスワップメソッドは、新しいオブジェクトのヒープにバッファが割り当てられている場合、代入演算子よりも高速になります。このような場合、代入演算子は新しいオブジェクトにバッファを割り当てる必要があります。その後、古いオブジェクトに別のバッファを割り当ててから、新しいオブジェクトのバッファから古いオブジェクトの新しいバッファにデータをコピーする必要があります。たとえば、バッファのポインタだけをスワップする高速スワップを実装するのは非常に簡単です。

  2. C++ 11。私は、スワップより遅い移動代入演算子の実装を見てきましたが、それは修正できますが、おそらく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()を常に好みます。

6
Yong

上記の答えに基づいて、書式設定もリセットする必要があります。新しいstd :: stringstreamインスタンスが構築されると、バッファーの内容、ストリーム状態フラグ、およびすべてのフォーマットがデフォルトにリセットされます。

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

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