ISTRINGSTREAM、OSTRINGSTREAM、およびStringStreamの違いは何ですか?/すべての場合でStringStreamを使用しないのはなぜですか?
-
18-09-2020 - |
質問
std::istringstream
、std::ostringstream
とstd::stringstream
を使用するのは、すべてのシナリオでstd::stringstream
を使用するだけではないのです(実行時性能の問題はありますか?)
最後に、これについての悪いものはあります(まったくストリームを使用する代わりに):
std::string stHehe("Hello ");
stHehe += "stackoverflow.com";
stHehe += "!";
. 解決
個人的には、同じ文字列ストリームにストリーミングを実行したいことを非常にまれに見つけました。
通常、ストリームを文字列から初期化してから解析したいです。または文字列ストリームに物事をストリーミングしてから結果を抽出して保存します。
同じストリームとの間でストリーミングしている場合は、ストリームの状態とストリームの位置に非常に注意してください。
「単なる」istringstream
またはostringstream
を使用すると、あなたの意図を表現し、<<
vs >>
の偶発的な使用などの愚かな間違いに対するいくつかのチェックを与えます。
そこががあるかもしれませんが、私はそれを最初に見ていないでしょう。
あなたが書いたことに問題はありません。あなたがそれが十分に機能しないと思うならば、あなたは他のアプローチをプロファイルすることができ、そうでなければ最も明るくなるものに固執することができます。個人的には、ただ行ってください:
std::string stHehe( "Hello stackoverflow.com!" );
. 他のヒント
stringstream
はやや大きいため、わずかに低いパフォーマンスが低い可能性があります - 複数の継承はVTableポインタへの調整を必要とする可能性があります。主な違いは、(少なくとも理論的には)あなたの意図を表現し、誤って>>
を使用してあなたが誤って<<
を使って(またはその逆)を使っているのを防ぎます。 OTOH、違いは、特にデモンストレーションコードの迅速なビットなどのために十分に小さく、私は怠け者で、stringstream
を使用します。 <<
を対象としたときに>>
を誤って使用した最後の時間を覚えておくことはできません。常に本当にはほとんどすぐに明らかにしています。
文字列を使うだけで、必要なものを使用するだけでは何も問題ありません。あなたがただ文字列をまとめるだけでは、それは簡単で、うまくいきます。他の種類のデータをフォーマットしたい場合は、stringstream
がそれをサポートし、主に文字列はそうではありません。
ほとんどの場合、同じStringStreamの入力と出力の両方が必要な場合は、std::ostringstream
とstd::istringstream
を使用して、意図を明確にすることが明確になります。また、誤って間違った演算子(<<
vs >>
)を誤って入力するのを防ぎます。
同じストリーム上で両方の操作をする必要があるときは、汎用バージョンを明らかに使用します。
パフォーマンスの問題はここでのあなたの懸念のうち少なくとも最も重要であるでしょう、明確さは主な利点です。
最後に、純粋な文字列を作成する必要があるときに文字列を使用することに何も問題がありません。あなたはそれを使ってあなたがPerlのような言語でできるような数字を組み合わせることはできません。
ISTRINGSTREAMは入力用、OSTRINGSTREAMが出力用です。StringStreamが入出力されます。 あなたはいらいらせていたるところで弦ストリームを使うことができます。 ただし、オブジェクトを別のユーザーに与える場合は、オペレータを使用していますが、オブジェクトの唯一のオブジェクトを待っているところでは、あなたは幸せにはなりません。 - )
PS: それについて悪いことはありません。パフォーマンスの問題だけです。
あなたの第三者に答えるために:いいえ、それは完全に合理的です。STREAMSを使用する利点は、operator<<
(C ++またはC)をstd::string
に追加することができます。
おそらく挿入または抽出のみが適切な場合は、不要な操作を除外するために、「i」または「O」のプレフィックスバージョンの1つを使用できます。
それが重要でない場合は、I / Oバージョンを使用できます。
あなたが示す文字列連結は完全に有効です。StringStreamを使用した連結が可能ですが、StringStreamの最も便利な機能ではありません。これは、PODと抽象データ型を挿入して抽出することができます。
std :: ostringStream :: str()ストリームのコンテンツのコピーを作成します。これは、状況によってはメモリ使用量を2倍にします。これを回避するには、代わりにstd :: stringStreamとrdbuf()関数を使用できます。
詳細はこちら: COUT に直接書き込む方法
読み取り/書き込みアクセスのためのファイルを開くのはなぜそれから読み取る必要がある場合は?
複数のプロセスが同じファイルから読み取る必要がある場合はどうなりますか?