Ich bin relativ neu in C++. Ich habe ein Codierungsproblem geübt und es war damit verbunden, eine Zeichenkette in Palindrom umzuwandeln.Leistung - mit Zeichenfolgekonstruktor vs mit Verkettung
I wurde Speichern der Zählung Alphabete in einem Vektor und später die palindrome wie diese Erzeugung -
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));
}
Aber für einen bestimmten Testfall (input enthaltend 2,10^5 e
s only), das Programm übersteigt wurde das Speicherlimit von 256 MB. Dann habe ich die innere Schleife nur mit dieser Aussage ersetzt -
und das Programm lief gut mit nur etwa 2,4 MB.
Also ich möchte fragen, ob dies mit der Leistung mit der Verwendung von Verkettung vs die Konstruktorfunktion verbunden ist, und wenn ja, was ist/sind die möglichen Grund/s?
Wenn es darauf ankommt, habe ich das Programm mit MS VC++ kompiliert 2010
Wenn es hilft, hier sind die Einreichungen (der Code) - the failed one (Testfall: 10) und the successful one.
Wenn Sie den Zusatz wie folgt ausführen, erhalten Sie möglicherweise jede Iteration eine neue Zuweisung. Wahrscheinlich ist das Zuweisen eines etwas größeren Stücks jedes Mal ein schlechter Fall für Ihren Zuordner. Es ist immer noch überraschend, dass es so schlimm wird. – zch
@zch Einverstanden. String wird beim Konstruieren mit etwas Speicherplatz vorbelegt. OP kann versuchen, die String-Konstruktion durch ein einfaches Zeichen zu ersetzen: palindrome_string + = 'a' + i; – texasbruce
Es gibt eigentlich keinen Sinn, eine temporäre Zeichenfolge zu konstruieren. 'palindrome_string.append (static_cast ('a' + i), alphabet_count [i])' würde das gleiche tun. –
VTT