[解決済み] C++による効率的な文字列の連結
2022-05-16 02:44:14
質問
std::string の "+" 演算子について心配している人や、連結を高速化するための様々な回避策を聞いたことがあります。これらのうちどれかが本当に必要なのでしょうか? もしそうなら、C++ で文字列を連結する最良の方法は何でしょうか?
どのように解決するのですか?
余分な作業は、あなたが本当に本当に効率を必要としない限り、おそらく価値がありません。 おそらく、代わりに演算子 += を使用するだけで、はるかに良い効率を得ることができます。
さて、この免責事項の後、私はあなたの実際の質問に答えます...
STL文字列クラスの効率は、使用しているSTLの実装に依存します。
あなたは 効率を保証する と より大きな制御ができる を自分でコントロールできるようになります。
なぜoperator+は効率的でないのか。
このインターフェイスを見てください。
template <class charT, class traits, class Alloc>
basic_string<charT, traits, Alloc>
operator+(const basic_string<charT, traits, Alloc>& s1,
const basic_string<charT, traits, Alloc>& s2)
各+の後に新しいオブジェクトが返されているのがわかると思います。これは、毎回新しいバッファが使われることを意味します。 もし余分な+操作を大量に行うのであれば、それは効率的ではありません。
より効率的にできる理由
- デリゲートを信頼して効率的にやってもらうのではなく、効率を保証することになる
- std::string クラスは文字列の最大サイズについて何も知りませんし、どれくらいの頻度で文字列を連結するのかも知りません。 あなたはこの知識を持っていて、この情報に基づいて物事を行うことができます。 これは再割り当てを減らすことにつながります。
- バッファを手動で制御することになるので、そうしたくないときに文字列全体を新しいバッファにコピーすることがないことを確認できます。
- ヒープの代わりにバッファにスタックを使用することができ、より効率的です。
- string + 演算子は新しい文字列オブジェクトを作成し、それを返すので、新しいバッファを使用します。
実装のための考慮点。
- 文字列の長さを記録する。
- 文字列の終端と開始へのポインタを保持するか、開始だけを保持し、開始+長さをオフセットとして使用して文字列の終端を見つけます。
- 文字列を格納するバッファが十分に大きいことを確認し、データを再割り当てする必要がないようにする。
- strcatの代わりにstrcpyを使用し、文字列の終わりを見つけるために文字列の長さを繰り返し処理する必要がないようにします。
ロープのデータ構造です。
もし、本当に高速な連結が必要な場合は ロープデータ構造 .
関連
-
[解決済み] gdbを使用してもデバッグシンボルが見つからない
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] SQLiteのINSERT/per-secondのパフォーマンスを向上させる
-
[解決済み] C++11では、標準化されたメモリモデルが導入されました。その意味するところは?そして、C++プログラミングにどのような影響を与えるのでしょうか?
-
[解決済み] 複数行の長い文字列を作成するためのPythonicな方法
-
[解決済み] 文字列フォーマット:% vs. .format vs. f-stringリテラル
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】大文字・小文字を区別しない「Contains(string)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】関数名の前に期待されるイニシャライザー
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。