std::istringstream
、std::ostringstream
、およびstd::stringstream
を使用するのはいつですか。また、すべてのシナリオでstd::stringstream
を使用しないのはなぜですか(実行時のパフォーマンスの問題はありますか?)。
最後に、(ストリームを使用する代わりに)これについて何か悪いことがありますか?
std::string stHehe("Hello ");
stHehe += "stackoverflow.com";
stHehe += "!";
個人的には、同じ文字列ストリームに出入りするストリーミングを実行することは非常にまれです。
通常、文字列からストリームを初期化してから解析します。または、文字列ストリームにストリームしてから、結果を抽出して保存します。
同じストリームとの間でストリーミングを行う場合、ストリームの状態とストリームの位置に非常に注意する必要があります。
'just' istringstream
またはostringstream
を使用すると、意図がより明確になり、<<
vs >>
。
そこにmightいくつかのパフォーマンスの改善がありますが、私は最初にそれを見ていません。
あなたが書いたことには何も問題はありません。十分なパフォーマンスが得られない場合は、他のアプローチのプロファイルを作成できます。個人的には、私はただ行くだけだ:
std::string stHehe( "Hello stackoverflow.com!" );
stringstream
はやや大きく、パフォーマンスがわずかに低下する可能性があります。多重継承では、vtableポインターの調整が必要になる場合があります。主な違いは、(少なくとも理論的には)意図をより良く表現し、誤って>>
意図した場所<<
(またはその逆)。 OTOH、その差は十分に小さいので、特にデモンストレーションコードなどの短いビットでは、私は怠け者で、stringstream
を使用しています。前回誤って使用した<<
意図したとき>>
、だから私にとって安全性のビットはほとんど理論的であるように思えます(特にdoがそのような間違いを犯すと、ほとんど常にreallyすぐに明らかになります)。
目的を達成する限り、文字列を使用するだけで何も問題はありません。単に文字列を組み合わせているだけであれば、簡単で問題なく動作します。ただし、他の種類のデータをフォーマットしたい場合、stringstream
はそれをサポートしますが、文字列はほとんどサポートしません。
ほとんどの場合、同じ文字列ストリームで入力と出力の両方が必要になることはないので、std::ostringstream
およびstd::istringstream
は、明示的に意図を明確にします。また、誤った演算子(<<
vs >>
)。
同じストリームで両方の操作を行う必要がある場合は、明らかに汎用バージョンを使用します。
ここではパフォーマンスの問題が最も懸念されることはありませんが、明快さが主な利点です。
最後に、純粋な文字列を作成する必要があるため、文字列の追加を使用しても問題はありません。 Perlなどの言語でできるように、それを使用して数値を結合することはできません。
istringstreamは入力用、ostringstreamは出力用です。 stringstreamは入力および出力です。どこでも文字列ストリームを使用できます。ただし、オブジェクトを別のユーザーに渡し、書き込みオブジェクトのみを待機している場合に演算子>>を使用すると、満足できません;-)
PS:パフォーマンスについては問題ありません。
3番目の質問に答えるには:いいえ、それは完全に合理的です。ストリームを使用する利点は、operator<<
が定義されている任意の種類の値を入力できることです。一方、std::string
に追加できるのは文字列(C++またはC)のみです。
おそらく、挿入または抽出のみが操作に適している場合は、「i」または「o」のいずれかのバージョンを使用して、不要な操作を除外できます。
それが重要でない場合は、I/Oバージョンを使用できます。
表示している文字列の連結は完全に有効です。 stringstreamを使用した連結は可能ですが、これはstringstreamsの最も有用な機能ではありません。PODおよび抽象データ型を挿入および抽出できることです。
たとえば、読み取りだけが必要な場合に、読み取り/書き込みアクセス用にファイルを開くのはなぜですか?
複数のプロセスが同じファイルから読み取る必要がある場合はどうなりますか?
std :: ostringstream :: str()は、ストリームのコンテンツのコピーを作成します。これにより、状況によってはメモリ使用量が2倍になります。これを回避するには、代わりにstd :: stringstreamとそのrdbuf()関数を使用できます。
詳細はこちら: ostringstreamをcoutに直接書き込む方法