web-dev-qa-db-ja.com

istringstream、ostringstream、stringstreamの違いは何ですか? /なぜすべての場合にstringstreamを使用しないのですか?

std::istringstreamstd::ostringstream、およびstd::stringstreamを使用するのはいつですか。また、すべてのシナリオでstd::stringstreamを使用しないのはなぜですか(実行時のパフォーマンスの問題はありますか?)。

最後に、(ストリームを使用する代わりに)これについて何か悪いことがありますか?

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
146
Oliver Baur

個人的には、同じ文字列ストリームに出入りするストリーミングを実行することは非常にまれです。

通常、文字列からストリームを初期化してから解析します。または、文字列ストリームにストリームしてから、結果を抽出して保存します。

同じストリームとの間でストリーミングを行う場合、ストリームの状態とストリームの位置に非常に注意する必要があります。

'just' istringstreamまたはostringstreamを使用すると、意図がより明確になり、<< vs >>

そこにmightいくつかのパフォーマンスの改善がありますが、私は最初にそれを見ていません。

あなたが書いたことには何も問題はありません。十分なパフォーマンスが得られない場合は、他のアプローチのプロファイルを作成できます。個人的には、私はただ行くだけだ:

std::string stHehe( "Hello stackoverflow.com!" );
102
CB Bailey

stringstreamはやや大きく、パフォーマンスがわずかに低下する可能性があります。多重継承では、vtableポインターの調整が必要になる場合があります。主な違いは、(少なくとも理論的には)意図をより良く表現し、誤って>>意図した場所<<(またはその逆)。 OTOH、その差は十分に小さいので、特にデモンストレーションコードなどの短いビットでは、私は怠け者で、stringstreamを使用しています。前回誤って使用した<<意図したとき>>、だから私にとって安全性のビットはほとんど理論的であるように思えます(特にdoがそのような間違いを犯すと、ほとんど常にreallyすぐに明らかになります)。

目的を達成する限り、文字列を使用するだけで何も問題はありません。単に文字列を組み合わせているだけであれば、簡単で問題なく動作します。ただし、他の種類のデータをフォーマットしたい場合、stringstreamはそれをサポートしますが、文字列はほとんどサポートしません。

20
Jerry Coffin

ほとんどの場合、同じ文字列ストリームで入力と出力の両方が必要になることはないので、std::ostringstreamおよびstd::istringstreamは、明示的に意図を明確にします。また、誤った演算子(<< vs >>)。

同じストリームで両方の操作を行う必要がある場合は、明らかに汎用バージョンを使用します。

ここではパフォーマンスの問題が最も懸念されることはありませんが、明快さが主な利点です。

最後に、純粋な文字列を作成する必要があるため、文字列の追加を使用しても問題はありません。 Perlなどの言語でできるように、それを使用して数値を結合することはできません。

15
Mark B

istringstreamは入力用、ostringstreamは出力用です。 stringstreamは入力および出力です。どこでも文字列ストリームを使用できます。ただし、オブジェクトを別のユーザーに渡し、書き込みオブジェクトのみを待機している場合に演算子>>を使用すると、満足できません;-)

PS:パフォーマンスについては問題ありません。

6
Scharron

3番目の質問に答えるには:いいえ、それは完全に合理的です。ストリームを使用する利点は、operator<<が定義されている任意の種類の値を入力できることです。一方、std::stringに追加できるのは文字列(C++またはC)のみです。

2
David Thornley

おそらく、挿入または抽出のみが操作に適している場合は、「i」または「o」のいずれかのバージョンを使用して、不要な操作を除外できます。

それが重要でない場合は、I/Oバージョンを使用できます。

表示している文字列の連結は完全に有効です。 stringstreamを使用した連結は可能ですが、これはstringstreamsの最も有用な機能ではありません。PODおよび抽象データ型を挿入および抽出できることです。

1
Amardeep AC9MF

たとえば、読み取りだけが必要な場合に、読み取り/書き込みアクセス用にファイルを開くのはなぜですか?

複数のプロセスが同じファイルから読み取る必要がある場合はどうなりますか?

0
Assaf Lavie

std :: ostringstream :: str()は、ストリームのコンテンツのコピーを作成します。これにより、状況によってはメモリ使用量が2倍になります。これを回避するには、代わりにstd :: stringstreamとそのrdbuf()関数を使用できます。

詳細はこちら: ostringstreamをcoutに直接書き込む方法

0
Gerhard Wesp