Link do strony
Ciekaw jestem waszego zdania na ten temat. Która metoda obsługi tekstu w C++ jest najlepsza?
[edit] W jakich sytuacjach którą powinno się stosować?
Mało precyzyjna ta strona, char*
dla literałów znakowych to nie "bad form", tylko po prostu niepoprawny kod: https://dev.krzaq.cc/stop-assigning-string-literals-to-char-star-already/
Osobiście, o ile nie piszesz kodu, który ma się kompilować w C i nie masz jakichś niesamowitych wymagań dot. wydajności1, to pisz z użyciem std::string
i std::string_view
. Jak masz takie wymagania to pewnie i tak wiesz co chcesz/musisz użyć.
1std::string
nie jest wolniejszy ani szybszy. Ale - szczególnie bez std::string_view
- czasem trochę ciężej nim operować jeśli np. chcesz bardzo dokładnie kontrolować jego czas życia Chodzi tu o bardzo niszowe problemy.
Wystarczy sobie wyobrazić / sprawdzić jaka jest męka z funkcją w duchu C zwracającą nowo powstały char *.
Obudowanie tego w dziesiątkach miejsc zwalnianiem (a czasem tzreba się wstrzymać ze zwalnianiem) ani nie jest bezpieczne, ani wydajne.
Jak ktoś szukał błedów pamięci w C, to dobrze wie dlaczego już używa std:string
Zdecydowanie std::string
. Sam ogarnia pamięć(czy to przy "normalnym" użyciu czy przy wyjątkach) i ma SSO.
Wersje ala C są przestarzałe.
- wskaźnikowa nie ma rozmiaru
- tablicowa wymaga specjalnego szablonu
Ja bym proponował stosować zawsze:
std::string s1 = "Hello"s;
Które jest stringiem zawsze od chwili narodzin.
https://en.cppreference.com/w/cpp/string/basic_string/operator%22%22s
stała typu std::string
ma tą wadę, że wymaga inicjalizacji przy starcie programu.
std::string_view
nie ma tej wady (konstruktory są constexpr
), a jest bardziej poręczny od const char[]
.
Z osobistych doświadczeń (bardziej z próby rzeczowej pomocy na SO) z napisami.
Można by oczekiwać, że std::ostringstream
powinien być zoptymalizowany do budowania napisu (taki builder dla std::string
).
Z moich testów wynika, że realloc bufora leci dość często zarzynając wydajność, podczas tworzenia dłuższych napisów.
Niestety API std::ostringstream
nie przewiduje metody reserve
, którą posiada std::string
. IMO to powinno być dodane do standardu.
Dlatego jak się nie robi bardziej skomplikowanego formatowania, dużo lepiej jest budować napis w samym std::string
zawczasu wywołując reserve
z przewidywaną długością napisu.