ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4258
Скачиваний: 28
Часть IV. Стандартная библиотека языка программирования С++
426
В заголовочном файле string также определяются типы
string
и
wstring
, которые являются синонимами шаблонных классов
basic_string<char>
и
basic_string<wchar_t>
соответственно, т. е.
синонимами контейнерных классов, элементами которых явля-
ются символы типов
char
и
wchar_t
.
Кроме того, в заголовочном файле string определены шаблоны
операторов сравнения и сцепления строк, а также функции для
ввода строк и обмена строк своими значениями. Все эти операто-
ры и функции будут рассмотрены в следующих разделах этой
главы.
39.1. Характеристики символов
Характеристики (traits) это множество классов, каждый из кото-
рых обладает определенными свойствами. Эти свойства задаются
набором типов и функций, которые должны быть определены в
любом классе из этого множества. Характеристики позволяют
единообразно обрабатывать различные классы, которые облада-
ют одинаковыми свойствами. Характеристики могут быть опре-
делены при помощи шаблона класса. В этом случае каждый шаб-
лонный класс, созданный из этого шаблона, обладает заданными
свойствами.
Характеристики символов задаются шаблоном класса
char_
traits
, который имеет следующий интерфейс:
template<class E> class char_traits
{
public:
// ассоциированный тип, определяемый параметром шаблона
typedef E char_type;
// ассоциированные типы, определяемые реализацией
typedef T1 int_type;
typedef T2 pos_type;
typedef T3 off_type;
typedef T4 state_type;
// функции присваивания
static void assign(char_type& x, const char_type& y);
Глава 39. Работа со строками в С++ <string>
427
static char_type* assign(
char_type *x, size_t n, char_type y);
// функции сравнения
static bool eq(const char_type& x, const char_type& y);
static bool lt(const char_type& x, const char_type& y);
static int compare(
const char_type *x, const char_type *y, size_t n);
static bool eq_int_type(
const int_type& ch1, const int_type& ch2);
// функция определения длины символа
static size_t length(const char_type *x);
// функции копирования символов
static char_type *copy(
char_type *x, const char_type *y, size_t n);
static char_type *move(
char_type *x, const char_type *y, size_t n);
// функция поиска символа
static const char_type *find(
const char_type *x, size_t n, const char_type& y);
// функции преобразования символов
static char_type to_char_type(const int_type& ch);
static int_type to_int_type(const char_type& c);
// функции определения конца файла
static int_type eof();
static int_type not_eof(const int_type& ch);
};
Предполагается, что параметр шаблона является типом, для кото-
рого определены конструктор по умолчанию, конструктор копи-
рования и оператор присваивания. Кроме того, побитовое копи-
рование объектов этого типа должно быть эквивалентно испол-
нению оператора присваивания.
Ассоциированные типы, определяемые реализацией, имеют сле-
дующее назначение:
int_type
— целочисленный тип, который допускает преобра-
зование к типу
E
и наоборот, а также обеспечивает представ-
ление любого символа, т. е. объекта типа
E
, без потери зна-
чения;
Часть IV. Стандартная библиотека языка программирования С++
428
pos_type
— тип для описания индикатора позиции файла;
off_type
— тип для описания смещения в операциях по изме-
нению значения индикатора позиции файла;
state_type
— тип для описания состояния разбираемой строки
длинных (multibyte) символов.
Прежде чем рассматривать функции-члены шаблона класса
char_traits
, заметим, что все они определены как статические
члены класса. Теперь перейдем к описанию этих функций:
assign
— присваивают символы. Первая функция присваивает
параметру
x
значение параметра
y
. Вторая функция присваи-
вает
n
элементам массива
x
значение параметра
y
;
eq
— возвращает значение
true
, если
x
равно
y
,
false
— в ос-
тальных случаях;
lt
— возвращает значение
true
, если
x
меньше
y
,
false
—
в остальных случаях;
compare
— поэлементно сравнивает массивы
x
и
y
длины
n
,
возвращает:
отрицательное число, если для первых не равных элементов
элемент массива
x
меньше элемента массива
y
;
ноль, если все элементы массивов равны;
положительное число в остальных случаях;
eq_int_type
— возвращает значение
true
, если
ch1
равно
ch2
,
значение
false
— в остальных случаях;
length
— возвращает количество символов в последователь-
ности
x
до первого символа
char_type()
;
copy
— копирует
n
символов из массива
x
в массив
y
. Возвра-
щает массив
x
. Массивы не должны перекрываться;
move
— копирует
n
символов из массива
x
в массив
y
. Возвра-
щает массив
x
. Массивы могут перекрываться;
find
— возвращает адрес первого элемента массива
x
, который
равен параметру
y
;
to_char_type
— преобразует значение параметра
ch
к типу
char_type
;
Глава 39. Работа со строками в С++ <string>
429
to_int_type
— преобразует значение параметра
c
к типу
int_type
;
eof
— возвращает значение, обозначающее конец файла. Это
значение не должно быть равно ни одному из значений типа
E
,
которое обозначает символ;
not_eof
— сравнивает значение параметра
ch
со значением
eof()
. Если эти значения не равны, то функция возвращает
значение параметра
ch
, в противном случае она возвращает
значение, отличное от значения
eof()
.
На практике шаблон класса
char_traits
используется редко, т. к.
в заголовочном файле string определены две явные специализа-
ции этого шаблона класса, а именно
char_traits<char>
и
char_traits<wchar_t>
, которые и используются при работе с сим-
волами типов
char
и
wchar_t
соответственно.
В листинге 39.1 приведен пример работы с шаблоном класса
char_traits
.
Листинг 39.1. Пример работы с шаблоном класса
char_traits
#include <iostream>
#include <string.h>
#include <string>
using namespace std;
int main()
{
typedef char_traits<char> traits;
char ch;
char* s = "Demo string";
char buf[256];
traits::assign(ch, 's');
cout << ch << endl; // s
cout << traits::compare(s, s, ::strlen(s)) << endl; // 0
traits::copy(buf, s, ::strlen(s) + 1);
cout << buf << endl; // Demo string
Часть IV. Стандартная библиотека языка программирования С++
430
cout << traits::eof() << endl; // -1
return 0;
}
39.2. Строки
В языке программирования С++ под строкой понимается контей-
нерный объект шаблонного класса, хранящий последователь-
ность символов:
template<class E, class T = char_traits<E>,
class A = allocator<E>> class basic_string;
При этом тип символов, из которых состоит строка, определяется
параметром
E
шаблона. Характеристики символов задаются па-
раметром
T
шаблона класса, а параметр
A
задает класс, который
управляет распределением памяти под символ типа
E
.
В заголовочном файле string также определяются типы
string
и
wstring
, которые являются синонимами шаблонных классов
basic_string<char>
и
basic_string<wchar_t>
соответственно. Эти
типы позволяют работать со строками, элементами которых яв-
ляются символы типов
char
и
wchar_t
соответственно. Как прави-
ло, этих типов хватает для обработки символьной информации,
исключая длинные (multibyte) символы восточных алфавитов.
Поэтому непосредственно с шаблоном класса
basic_string
рабо-
тают редко.
Строки языка программирования С++ обладают следующей до-
полнительной функциональностью по сравнению со строками
языка программирования С:
автоматическое управление размером строки;
вставка в строку символов и других строк;
удаление из строки символов и подстрок;
замена в строке символов и подстрок.
В следующих подразделах описаны все открытые (public) типы и
члены, определенные в шаблоне класса
basic_string
.