先頭に追加する最も効率的な方法は何std::string
ですか? そのために関数全体を書き出す価値はありますか、それとも 1 ~ 2 行しかかからないのでしょうか? に関連するものは何も表示されませんstd::string::push_front
。
4 に答える
実際には、存在しない と同様の機能がありstd::string::push_front
ます。以下の例を参照してください。
#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
データのコピー/移動は、大きなバッファーを割り当てて最初のコンテンツをこのメモリ バッファーの中央に配置するように動作する独自のカスタム クラスを定義しない限り、残念ながら避けられません。
次に、バッファが十分に大きい場合は、再割り当てやデータの移動なしで、データの先頭と末尾の両方を追加できます。ただし、ソースから宛先へのコピーは、明らかに必要です。
追加するよりも頻繁にデータを前に追加することがわかっているバッファーがある場合、適切な代替手段は、文字列を逆方向に格納し、必要に応じて逆にすることです (それがよりまれな場合)。
myString.insert(0, otherString);
標準テンプレート ライブラリの作成者は、効率について心配する必要があります。ホイールを再プログラミングするのではなく、すべての時間を活用してください。
この方法は、その両方を行います。
使用している STL 実装が十分に検討されている限り、効率的なコードが得られます。不適切に記述された STL を使用している場合は、とにかく大きな問題が発生します :)
を使用している場合は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");
ただし、上記を行うのはかなり非効率的であることに注意してください。
オーバーロードさstring operator+ (char lhs, const string& rhs);
れているのでyour_string 'a' + your_string
、模倣するだけで済みますpush_front
。
これはインプレースではありませんが、新しい文字列を作成するため、効率的であるとは期待しないでください。(おそらく) より効率的な解決策として、 を使用resize
してスペースを収集std::copy_backward
し、文字列全体を 1 つ後ろにシフトして、先頭に新しい文字を挿入します。