2016-02-26 18 views
11

zauważyłem, żeDlaczego std :: string :: append() jest mniej wydajny niż std :: string :: operator +()?

std::string str; 
str += 'b'; // works 
str.append('b'); // does not work 
str.append(1, 'b'); // works, but not as nice as the previous 

Czy jest jakiś powód, dla którego metoda append nie obsługuje pojedynczy znak, aby być dołączone? Zakładam, że operator+= jest w rzeczywistości opakowaniem dla metody append, ale wydaje się, że tak nie jest.

+0

Technicznie nie jest tak, że jest słabszy, ale nikt nie pomyślał, że konieczne jest napisanie 'std :: string :: append (char)'. Użyj '+ =' jeśli chcesz to zrobić ... –

+0

Powiązane: http://stackoverflow.com/questions/1472048/how-to-append-a-char-to-a-stdstring –

+0

Możesz użyć 'std :: string :: append (count, char) 'z' count = 1' lub 'std :: string :: push_back (char)' –

Odpowiedz

2

Warto zauważyć, że forma append tutaj;

string& append(size_type count, CharT ch); 

Odzwierciedla konstruktora wykonującego similar input.

basic_string(size_type count, 
       CharT ch, 
       const Allocator& alloc = Allocator()); 

i kilka innych metod, które zajmują się count o charakterze, takie jak resize(size_type count, CharT ch);.

klasy String jest duża i jest możliwe, że dany przypadek użycia (i przeciążenie) dla str.append('b'); nie zostało uznane lub alternatywne zostały uznane za wystarczające.

Po prostu proste wprowadzenie pojedynczego przeciążenia do tego może wprowadzić niejednoznaczność, jeśli całki odpowiadają (na niektórych platformach może to mieć miejsce) int i char.

Istnieje kilka alternatyw dla append dodawania pojedynczego znaku.

  • Dodanie łańcucha zawierającego pojedynczy znak można wykonać str.append("b");. Chociaż to nie jest dokładnie to samo, ma ten sam efekt.
  • Jak wspomniano istnieje operator+=
  • Istnieje również push_back(), co jest zgodne z innymi standardowymi kontenerami

Chodzi o to, że prawdopodobnie nigdy uważane za przypadek użycia (lub silnego przypadku wystarczy używać), a tym samym , odpowiednie przeciążenie/sygnatura nie została dodana do append, aby to uwzględnić.


alternatywne projekty mogą być dyskutowane, ale biorąc pod uwagę dojrzałość standardu i tej klasy, jest mało prawdopodobne, zostaną one zmienione wkrótce - może to bardzo dobrze złamać dużo kodu. Można również rozważyć alternatywne podpisy dla append; jednym z możliwych rozwiązań mogłoby być odwrócenie kolejności count i char (prawdopodobnie dodanie wartości domyślnej);

string& append(CharT ch, size_type count = 1); 

Innym, jak opisano w niektórych critique of basic_string jest usunięcie append, istnieje wiele sposobów, aby osiągnąć to, co robi.

5

Uważam, że operator+=() jest przeznaczony do obsługi wszystkich prostych przypadków (biorąc tylko jeden parametr), podczas gdy append() dotyczy rzeczy, które wymagają więcej niż jednego parametru.

Jestem rzeczywiście bardziej zaskoczony o istnienia z pojedynczym parametrem append(const basic_string& str) i append(const CharT* s) niż o braku z append(CharT c).

Należy również zauważyć, mój komentarz powyżej: char jest po prostu typu integer. Dodanie pojedynczego parametru, przeciążenie typu całkowitego do append() - lub konstruktora (który, ze względu na konstrukcję, może mieć już kilka przeciążeń typu całkowitoliczniczego) może wprowadzić niejednoznaczność.

Chyba że ktoś znajdzie jakieś pisemne uzasadnienie lub niektórzy członkowie komitetu zamieścili tutaj to, co pamiętają o dyskusji, to prawdopodobnie równie dobre wyjaśnienie, jak każde inne.

Powiązane problemy