私はC++を比較的新しく使用しています。私はコーディングの問題を練習していて、文字列を回文に変換することに関連していました。パフォーマンス - 文字列コンストラクタを使用し、連結を使用して
Iはベクトルでアルファベットのカウントを記憶し、後でこのようなパリンドロームを生成した -
string palindrome_string;
for (short i = 0; i < 26; ++i) {
alphabet_count[i] /= 2;
for (short j = 0; j < alphabet_count[i]; ++j)
palindrome_string += string(1, static_cast<char>('a' + i));
}
しかし、特定のテストケース(のみ2.10^5 e
S含有入力)のために、プログラムを超えましたメモリの制限は256 MBです。次に、このステートメントで内部ループを置き換えました。
palindrome_string += string(alphabet_count[i], static_cast<char>('a' + i));
このプログラムは約2.4 MBしか使用しないで正常に動作しました。
これは、コンカチネーションとコンストラクタ関数を使用した場合のパフォーマンスに関連しているかどうかを確認したい場合は、それが可能な理由は何ですか?そしてthe successful one:the failed one(10テストケース) - それは問題にした場合、それが助け場合
、私はMS VC++ 2010
でプログラムをコンパイルし、ここでの提出(コード)があります。
このように追加すると、繰り返しごとに新しい割り当てが得られる可能性があります。おそらく毎回わずかに大きなスライスを割り当てることは、あなたのアロケータには悪いケースです。しかし、それはそれが悪いことを得ることはまだ驚くべきことです。 – zch
@zch合意。あなたがそれを構築するとき、文字列はあるメモリ空間であらかじめ割り当てられています。 OPは単純な文字列で文字列構造を置き換えることができます:palindrome_string + = 'a' + i; – texasbruce
実際には、一時ストリングを構成するポイントはありません。 'palindrome_string.append(static_cast( 'a' + i)、alphabet_count [i])'は同じことをします。 –
VTT