Класс string
В языке Cстрока представляет собой символьный массив, заканчивающийся двоичным нулём (так называемыеnull-terminatedстроки). Подобному представлению строк характерны все недостатки встроенных массивов1, а так же необходимость постоянно следить за правильность представления строки: нулевой символ всегда должен заканчивать строку и не должен случайно оказаться в середине строки, так как это будет воспринято как конец строки.
Заменой встроенных массивов элементов любых типов является класс vector, соответственно вместо С-строк может быть использованvector<char>, и в некоторых случаях это имеет смысл. Однако очень часто над строками необходимо выполнять операции несвойственные векторам, такие как конкатенация строк, поиск подстрок, удаление подстрок и т.п.; и нет необходимости выполнять некоторые операции вектора. Также для строк имеет смысл операция сложения (конкатенации), что не имеет смысл для произвольного массива, использование перегруженного оператора сложения позволяет в значительной степени упростить запись некоторых выражений. По этим причинам стандартная библиотека содержит специальный класс для работы со строками -string
Определение класса string
В действительности класс stringявляется синонимом одной из специализаций шаблонаbasic_string, классbasic_stringкак и все средства стандартной библиотеки определен в пространстве именstd, его определение находится в заголовочном файле <string>
template <class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch> >
class std::basic_string
{
…
}
typedef basic_string<chat> string;
typedef basic_string<wchat_t> wstring;
Шаблон basic_stringимеет следующие параметры:
Ch– тип символов содержащихся в строке. Стандартной библиотекой поддерживаются два типа символов:char–ASCIIсимволы иwchar_t– символы из расширенного набораUnicode. Возможна адаптация шаблонаbasic_stringдля любого другого класса, представляющего символ (например, китайские иероглифы), однако это требует достаточно глубоко знанияSTL.
Tr– класс содержащий свойства символов содержащихся в строке этого типа (в данном случае под свойствами понимается свойства типа используемого в строке для представления символа). Этот параметр поддерживает значение по умолчанию, которое может быть использовано в большинстве случаев2.
A– класс указывающие используемый распределитель памяти3, значение по умолчанию может быть использовано в большинстве случае.
Классы stringиwstringявляются синонима специализаций шаблонаbasic_stringдля простого и расширенного набора символов. Класс строки содержащий символы из простого набора может быть объявлен:
#include <string>
using namespace std;
string MyString;
Экспортируемые типы
Аналогично классу vectorклассstringопределяет следующие типы данных.
template <class Ch, class Tr = char_traits<Ch>, class A = allocator<Ch> >
class std::basic_string
{
public:
typedef Tr traits_type;
typedef typename traits::char_type value_type;
typedef A allocator_type;
typedef typename A::sizetype size_type;
typedef typename A::difference_type difference_type;
typedef implementation_dependent1 iterator;
typedef implementation_dependent2 const_iterator;
typedef std::reverse_iterator<iterator> reverse_iterator;
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
typedef typename A::pointer pointer;
typedef typename A::const_pointer const_pointer;
typedef typename A::reference reference;
typedef typename A::const_reference const_reference;
…
}
Имена типов имею тоже самое значение, что и имена типов класса vector.