1. ホーム
  2. c++

std::stringのプリペンド

2023-09-26 14:01:14

質問

を前置する最も効率的な方法は何でしょうか? std::string ? そのために関数全体を書き出す価値があるでしょうか、それとも1~2行で済むでしょうか?私は std::string::push_front .

どのように解決するのですか?

実は似たような機能で、存在しない std::string::push_front と同じような機能があり、以下の例を見てください。


std::string::insert のドキュメンテーション

#include <iostream>
#include <string>

int
main (int argc, char *argv[])
{
  std::string s1 (" world");
  std::string s2 ("ello");

  s1.insert (0,     s2); // insert the contents of s2 at offset 0 in s1
  s1.insert (0, 1, 'h'); // insert one (1) 'h'        at offset 0 in s1

  std::cout << s1 << std::endl;
}

を出力します。

hello world


文字列のプリペンドには、データの再割り当てと既存データのコピー/移動の両方が必要な場合があるため、再割り当ての部分を削除するために std::string::reserve (を使用することで再割り当ての部分を取り除くことができます(事前に多くのメモリを割り当てるため)。

のように振る舞う独自のカスタムメイドのクラスを定義しない限り、データのコピー/移動は悲しいかな、全く避けられないものです。 std::string のように動作し、大きなバッファを割り当てて、最初のコンテンツをこのメモリバッファの中央に配置する独自のカスタムクラスを定義しない限り、データのコピー/移動は避けられません。

そうすれば、バッファが十分に大きければ、再割り当てやデータの移動なしに、データの前付けと後付けの両方が可能になります。からのコピー ソース から 宛先 はまだ、明らかに必要ですが。


もし、あなたが以下のようなバッファを持っている場合 前置詞 よりも頻繁にデータを を追加する を使用する場合、文字列を逆向きに保存し、必要なときにそれを反転させるのが良い方法です(それがよりまれである場合)。