76

先頭に追加する最も効率的な方法は何std::stringですか? そのために関数全体を書き出す価値はありますか、それとも 1 ~ 2 行しかかからないのでしょうか? に関連するものは何も表示されませんstd::string::push_front

4

4 に答える 4

106

実際には、存在しない と同様の機能があり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データのコピー/移動は、大きなバッファーを割り当てて最初のコンテンツをこのメモリ バッファーの中央に配置するように動作する独自のカスタム クラスを定義しない限り、残念ながら避けられません。

次に、バッファが十分に大きい場合は、再割り当てやデータの移動なしで、データの先頭と末尾の両方を追加できます。ただし、ソースから宛先へのコピーは、明らかに必要です。


追加するよりも頻繁にデータを前に追加することがわかっているバッファーがある場合、適切な代替手段は、文字列を逆方向に格納し、必要に応じて逆にすることです (それがよりまれな場合)。

于 2011-12-12T00:24:07.753 に答える
13
myString.insert(0, otherString);

標準テンプレート ライブラリの作成者は、効率について心配する必要があります。ホイールを再プログラミングするのではなく、すべての時間を活用してください。

この方法は、その両方を行います。

使用している STL 実装が十分に検討されている限り、効率的なコードが得られます。不適切に記述された STL を使用している場合は、とにかく大きな問題が発生します :)

于 2014-01-27T11:11:15.013 に答える
7

を使用している場合はstd::string::append、以下が同等であることを理解する必要があります。

std::string lhs1 = "hello ";
std::string lhs2 = "hello ";
std::string rhs = "world!";

lhs1.append(rhs);
lhs2 += rhs; // equivalent to above
// Also the same:
// lhs2 = lhs2 + rhs;

同様に、「prepend」は次と同等です。

std::string result = "world";
result = "hello " + result;
// If prepend existed, this would be equivalent to
// result.prepend("hello");

ただし、上記を行うのはかなり非効率的であることに注意してください。

于 2011-12-12T00:18:39.090 に答える
3

オーバーロードさstring operator+ (char lhs, const string& rhs);れているのでyour_string 'a' + your_string、模倣するだけで済みますpush_front

これはインプレースではありませんが、新しい文字列を作成するため、効率的であるとは期待しないでください。(おそらく) より効率的な解決策として、 を使用resizeしてスペースを収集std::copy_backwardし、文字列全体を 1 つ後ろにシフトして、先頭に新しい文字を挿入します。

于 2011-12-12T00:18:25.153 に答える