Przede wszystkim std::stringbuf
nie nie koniecznie (lub nawet zwykłe) stosują std::string
jego pamięci wewnętrznej. Na przykład norma opisuje inicjację z std::string
następująco:
Konstrukty Przedmiotem klasy basic_stringbuf ... Następnie kopiuje zawartość str do basic_stringbuf podstawowej sekwencji znaków [...]
Zwróć uwagę na sformułowanie: "sekwencja znaków" - przynajmniej dla mnie wydaje się to bardzo ostrożne, aby nie powiedzieć (a nawet sugerować), że treść powinna być przechowywana w rzeczywistym ciągu znaków.
Po tym, myślę, że wydajność jest prawdopodobnie czerwonym śledziem. Oba są dość cienkimi owijkami do zarządzania dynamicznie przydzielanymi buforami o pewnej sekwencji przypominającej znak. Istnieje duża różnica w możliwościach (np. string
ma wiele wyszukiwania i wstawiania/usuwania w środku ciągu, który jest całkowicie nieobecny w stringbuf
). Biorąc pod uwagę jego cel, może być sens implementacja stringbuf
nad czymś takim jak std::deque
, aby zoptymalizować (zwykłą) ścieżkę wstawiania/usuwania na końcach, ale jest to prawdopodobnie nieistotne dla większości zastosowań.
Gdybym robił to, bym prawdopodobnie najbardziej martwi fakt, że stringbuf
jest prawdopodobnie tylko przetestowane wraz z stringstream
, więc jeśli użyłem go inaczej niż stringstream
zrobił, mogę napotkać problemy, nawet jeśli jestem zgodnie z tym, co standard mówi, że powinien wspierać.
Chciałbym zapytać odwrotnie: dlaczego do cholery używam 'stringbuf', gdy' string' ma dużo więcej dostępnych metod, masochizm? Przypuszczam, że pochodzą z Java lub C# z ich klasy StringBuilder obejść ... –
@MatthieuM.: nie jestem programistą C++, ale tak, dlaczego ostringstream używa wewnętrznie stringbuf zamiast stringa – Guillaume07
To jest zupełnie inne. Wszystkie klasy wywodzące się z 'ostream' używają bufora, który pochodzi od [streambuf] (http://www.cplusplus.com/reference/iostream/streambuf/), dlatego' stringbuf' jest po prostu wrapperem 'string', który dziedziczy po 'streambuf', dzięki czemu można go tam wykorzystać. Typowe zastosowanie wzoru adaptera lub mostka. –