Действительно ли std :: string оборачивает массив C char? - PullRequest
4 голосов
/ 13 марта 2012

Я всегда думал, что std::string был реализован как оболочка STL для строки массива C char.Но, присмотревшись к дизайну, я заметил, что он не дает ни намека, ни признака того, что он является завернутой к-струной.Насколько я знаю, std::string может делать что-нибудь внутренне!

Конечно, есть метод c_str(), который, как я думал, возвращает внутренний массив символов, но как мне узнать, еслиметод не создает массив new c char из каких-либо данных, которые он хранит внутри, и возвращает его?

Серьезно, как был реализован std::string?Является ли это (как кажется) просто оболочкой для массива C char или это что-то еще?Или смесь двух?Или даже может стать и условно?

1 Ответ

12 голосов
/ 13 марта 2012

Насколько я знаю, std :: string может делать что угодно внутри!

Для всех вы знаете. Стандарт, конечно, описывает и требует определенной семантики, которая исключает что-либо . В шаблоне basic_string написано следующее:

§21.4 [basic.string] p1

Шаблон класса basic_string описывает объекты, которые могут хранить последовательность, состоящую из различного числа произвольных подобных символу объектов с первым элементом последовательности в нулевой позиции. Такая последовательность также называется «строкой», если тип хранящихся в ней символов, подобных ей, ясен из контекста. В оставшейся части этого раздела тип объектов типа char, содержащихся в объекте basic_string, обозначается charT.

А «символоподобный объект» определяется следующим текстом:

§21.1 [strings.general] p1

В этом разделе описываются компоненты для управления последовательностями любого типа, не являющегося массивом POD (3.9). В этом разделе такие типы называются символоподобными типами , а объекты типоподобных типов называются символоподобными объектами или просто символами .

Это фактически означает, что вы можете вставить все, что вы хотите, в basic_string, если это не массив, а POD (см. this и this для получения информации о что такое PODы). Этими подобными символу объектами затем манипулируют с помощью черт характера, которые определяют специфическое поведение и отношения между ними.


[...] но как я узнаю, что метод не создает новый массив c char из каких-либо данных, которые он хранит внутри, и возвращает его?

В C ++ 03 именно это можно было сделать для реализации, известный дефект, который с тех пор был исправлен в C ++ 11:

§2.4.1 [string.require] p5

Подобные символу объекты в объекте basic_string должны храниться непрерывно. То есть для любого basic_string объекта s тождество &*(s.begin() + n) == &*s.begin() + n должно сохраняться для всех значений n, таких что 0 <= n < s.size().

См. Также эти связанные вопросы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...