2012-04-25 16 views
6

Kiedy musimy pracować z manipulacją ciągami, czy istnieje jakaś różnica w wydajności między std :: string i std :: stringbuf, a jeśli tak, to dlaczego.performance stringbuf vs string

Bardziej ogólnie, gdy dobrze jest używać std :: stringbuf over std :: string?

+2

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ść ... –

+0

@MatthieuM.: nie jestem programistą C++, ale tak, dlaczego ostringstream używa wewnętrznie stringbuf zamiast stringa – Guillaume07

+0

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. –

Odpowiedz

6

Używa wewnętrznego ciągu znaków do buforowania danych, więc prawdopodobnie jest nieco wolniejszy. Nie sądzę, by różnica była znacząca, ponieważ to po prostu tylko delegacja. Aby mieć pewność, że musisz wykonać kilka testów wydajności.

std::stringbuf jest przydatna, gdy chcesz, aby strumień IO używał ciągu jako bufora (np. std::stringstream, który domyślnie używa std::stringbuf).

+0

Pytanie pozostaje wciąż bez odpowiedzi: _jest tam __sygfikat i__ różnica w wydajności_. Zgodnie z twoją logiką: 'std :: string' wewnętrznie używa tablic' char', więc nie, powinieneś trzymać się tablic 'char'. –

+0

@MaximYegorushkin: Masz rację - poprawiłem to. –

3

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ć.

0

std::stringbuf rozszerza kontener std::string, do czytania i pisania do std::string.

Ogólnie nie ma znaczącej różnicy w wydajności między wartościami std::string i std::stringbuf.

Ponieważ std::streambuf < - std::stringbuf, zarówno z powodu:

typedef basic_stringbuf<char> stringbuf;  
typedef basic_string<char> string; 

Czytaj this więcej szczegółów.