istringstream、ostringstream、stringstreamの違いは何ですか?/すべてのケースでstringstreamを使用しないのはなぜですか?


163

私が使用した場合std::istringstreamstd::ostringstreamそしてstd::stringstream、なぜ私は使用しないでくださいstd::stringstreamすべてのシナリオで(任意の実行時のパフォーマンスの問題があります?)。

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

std::string stHehe("Hello ");

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

回答:


119

個人的には、同じ文字列ストリームにストリーミングしたり、同じストリングストリームからストリーミングしたりすることは非常にまれです。

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

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

「ただ」istringstream以上を使用ostringstreamすると意図が表現され、<<vs を誤って使用するなどの愚かな間違いをチェックできます>>

そこかもしれないいくつかのパフォーマンスの改善をすることが、私は、最初のを見ていられないでしょう。

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

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

22

A stringstreamはやや大きく、パフォーマンスがわずかに低下する可能性があります-多重継承では、vtableポインターの調整が必要になる場合があります。主な違いは、(少なくとも理論的には)意図をより適切に表現し、意図した>>場所<<(またはその逆)を誤って使用しないようにすることです。OTOH、違いは十分に小さいので、特にデモンストレーションコードの短いビットなどでは、私は怠惰でちょうど使用しますstringstream。私はかなり私が誤って使用された最後の時間を思い出すことができない<<私が意図したときに>>(あなたがいる場合、特に以来そう私には安全性のビットはほとんど理論的なようで、やるなミスをし、それはほとんど常にだろう本当にほとんどすぐに明らかに)。

文字列を使用するだけで問題はありません。文字列を組み合わせるだけの場合は、簡単で問題なく動作します。ただし、他の種類のデータをフォーマットする場合は、aでstringstreamサポートされ、文字列ではほとんどサポートされません。


17

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

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

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

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


8

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

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


2

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


1

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

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

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



0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.