To naprawdę jest pytanie tylko dla mojego własnego interesu, którego nie udało mi się ustalić za pomocą dokumentacji.C++ std :: string append vs push_back()
widzę na http://www.cplusplus.com/reference/string/string/ że dołączy ma złożoność „Nieokreślony, ale ogólnie do liniowy w nowej długości łańcucha”
podczas push_back() ma złożoność:
„nieokreślony; Generalnie amortyzuje stała, ale do liniowy w nowej długości strun.”
Jako przykład zabawny, przypuśćmy, że chcę dołączyć znaki "foo" do ciągu znaków. Czy
myString.push_back('f');
myString.push_back('o');
myString.push_back('o');
i
myString.append("foo");
wynoszą dokładnie to samo? Czy jest jakaś różnica? Można uznać, że ten dodatek byłby bardziej wydajny, ponieważ kompilator wiedziałby, ile pamięci jest wymagane do rozszerzenia ciągu znaków o określoną liczbę znaków, podczas gdy funkcja push_back może potrzebować zabezpieczyć pamięć każdego wywołania?
Oprócz oczywistych (pierwsze z nich to trzy wywołania funkcji, a drugie tylko jeden), pierwsza z nich może spowodować trzy ponowne przydziały. Osobiście wolałbym używać 'myString + =" foo ";' ponieważ myślę, że jest bardziej "naturalny", mimo że jest taki sam jak wywołanie 'append'. –
Słowa kluczowe: "do". Chociaż niefortunne jest to, że nie określili typowego przypadku "append", tylko najgorszego. –
@JoachimPileborg: 'push_back' musi być amortyzowany w stałym czasie, więc prawdopodobieństwo trzech przydziałów dla każdej realizacji, o której wiem, wynosi zero. Większość zaczyna od pewnego rozsądnego rozmiaru (większego niż 1 lub 2) i geometrycznie wzrasta bazowy bufor (o współczynnik 1,5 lub 2 razy na wzrost wielkości). –