181

いつ使用しますか。またstd::istringstream、すべてのシナリオで使用する必要がないのはなぜですか(実行時のパフォーマンスの問題はありますか?)。std::ostringstreamstd::stringstreamstd::stringstream

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

std::string stHehe("Hello ");

stHehe += "stackoverflow.com";
stHehe += "!";
4

8 に答える 8

131

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

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

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

'just'istringstream以上を使用すると、意図が表現され、 vsostringstreamの誤った使用などのばかげた間違いに対するチェックが可能になります。<<>>

パフォーマンスがいくらか改善されるかもしれませんが、私はそれを最初に見ていません。

あなたが書いたものに何も問題はありません。十分に機能しない場合は、他のアプローチのプロファイルを作成できます。それ以外の場合は、最も明確な方法を使用します。個人的に、私はただ行きます:

std::string stHehe( "Hello stackoverflow.com!" );
于 2010-07-20T16:25:39.603 に答える
25

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

文字列を使用するだけで、目的の結果が得られる限り、何も問題はありません。文字列をまとめるだけの場合は、簡単で問題なく機能します。ただし、他の種類のデータをフォーマットする場合は、stringstreamがサポートしますが、文字列はほとんどサポートしません。

于 2010-07-20T16:27:11.370 に答える
20

ほとんどの場合、同じ文字列ストリームで入力と出力の両方が必要になることはないため、andを使用するstd::ostringstreamstd::istringstream明示的に意図が明確になります。また、誤って間違った演算子(<<vs >>)を入力するのを防ぎます。

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

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

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

于 2010-07-20T16:29:56.977 に答える
12

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

PS:それについて悪いことは何もありません、ただパフォーマンスの問題です。

于 2010-07-20T16:26:55.873 に答える
3

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

于 2010-07-20T16:28:31.447 に答える
3

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

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

于 2019-05-12T13:54:19.143 に答える
1

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

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

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

于 2010-07-20T16:29:07.123 に答える
0

たとえば、ファイルから読み取るだけでよいのに、なぜファイルを読み取り/書き込みアクセス用に開くのですか?

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

于 2010-07-20T16:27:43.777 に答える