ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 13.12.2020
Просмотров: 4256
Скачиваний: 28
Глава 39. Работа со строками в С++ <string>
431
39.2.1. Ассоциированные типы
В шаблоне класса
basic_string
определены следующие типы,
определяемые параметрами шаблона класса:
typedef T traits_type;
typedef A allocator_type;
Кроме того, в шаблоне класса
basic_string
определены следую-
щие типы, значение которых зависит от реализации шаблона
класса:
typedef T0 iterator;
typedef T1 const_iterator;
typedef T2 size_type;
typedef T3 difference_type;
typedef reverse_iterator<iterator> reverse_iterator;
typedef reverse_iterator<const_iterator>
const_reverse_iterator;
typedef typename allocator_type::pointer pointer;
typedef typename allocator_type::const_pointer
const_pointer;
typedef typename allocator_type::reference reference;
typedef typename allocator_type::const_reference
const_reference;
typedef typename allocator_type::value_type value_type;
Эти типы имеют следующее назначение:
iterator
и
const_iterator
— определяют соответственно типы
переменных и константных итераторов произвольного досту-
па, связанных со строкой;
size_type
— служит для описания длин строк;
difference_type
— служит для описания разности адресов
двух символов строки;
reverse_iterator
и
reverse_iterator
— определяют соответст-
венно типы переменных и константных обратимых итерато-
ров, связанных со строкой;
pointer
и
const_pointer
— описывают соответственно указа-
тели на элементы переменных и константных строк;
Часть IV. Стандартная библиотека языка программирования С++
432
reference
и
const_reference
— описывают соответственно
ссылки на элементы переменных и константных строк;
value_type
— описывает тип элементов строки.
Итератор (iterator) это абстракция указателя языка программиро-
вания С++. Можно сказать, что итератор это множество классов,
в каждом из которых перегружены операторы разыменования
*
,
инкремента
++
и декремента
--
, которые имеют тот же смысл, что
соответствующие операторы, применяемые к указателям. В стан-
дартной библиотеке STL итераторы детально классифицированы
в соответствии с набором перегруженных в них операторов и се-
мантикой исполнения этих операторов. Здесь же только скажем,
что любой итератор произвольного доступа (random access
iterator) перегружает дополнительно арифметические операторы
+
,
-
,
+=
и
-=
, а также оператор индексирования
[]
. В отличие от
итератора произвольного доступа в обратном итераторе оператор
индексирования не обязательно может быть перегружен.
Использование типов, ассоциированных с шаблоном класса
basic_string
, обеспечивает независимость программ от значений
параметров и реализации этого шаблона класса.
39.2.2. Специальное значение
символьного типа
Статический член:
static const size_type npos = -1;
шаблонного класса
basic_string
определяет константу, значение
которой не является действительным символом. Эта константа
служит для возвращения значения, выходящего за пределы до-
пустимых значений символов, или как специальный код.
39.2.3. Конструкторы
В шаблоне класса
basic_string
определены следующие конст-
рукторы:
basic_string();
explicit basic_string(const allocator_type& al);
Глава 39. Работа со строками в С++ <string>
433
basic_string(size_type n, value_type c);
basic_string(size_type n, value_type c,
const allocator_type& al);
basic_string(const value_type *s, size_type n);
basic_string(const value_type *s, size_type n,
const allocator_type& al);
basic_string(const value_type *s);
basic_string(const value_type *s, const allocator_type& al);
basic_string(const basic_string& rhs);
basic_string(const basic_string& rhs, size_type pos,
size_type n = npos);
basic_string(const basic_string& rhs, size_type pos,
size_type n, const allocator_type& al);
Все конструкторы запоминают распределитель памяти и инициа-
лизируют последовательность символов в шаблонном классе.
Если распределитель памяти присутствует как параметр
al
, то он
и запоминается. Конструкторы копирования запоминают распре-
делитель памяти
rhs.get_allocator()
. Остальные конструкторы
запоминают распределитель памяти
A()
, где
A
— параметр шаб-
лона.
Все остальные параметры конструкторов служат для инициали-
зации последовательности символов, хранящейся в строке, и
имеют следующее назначение:
n
— конструкторов задает начальную длину создаваемой
строки;
c
— задает символ, которым инициализируется строка;
s
— задает строку языка программирования С, которой ини-
циализируется строка;
rhs
— задает другую строку, которой инициализируется соз-
даваемая строка;
pos
— задает позицию в строке, начиная с которой эта строка
копируется в создаваемую строку.
Если других параметров нет, то инициализируется пустая строка.
В листинге 39.2 приведены примеры инициализации строк.
Часть IV. Стандартная библиотека языка программирования С++
434
Листинг 39.2. Примеры инициализации строк
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s1(3, 'a');
cout << s1 << endl; // aaa
string s2("Demo string");
cout << s2 << endl; // Demo string
string s3("Demo string", 4);
cout << s3 << endl; // Demo
string s4(s2);
cout << s4 << endl; // Demo string
string s5(s2, 5, 6);
cout << s5 << endl; // string
return 0;
}
39.2.4. Шаблоны конструкторов
В шаблоне класса
basic_string
определены следующие шаблоны
конструкторов:
template <class InIt> basic_string(InIt first, InIt last);
template <class InIt> basic_string(InIt first,
InIt last, const allocator_type& al);
Шаблоны конструкторов служат для инициализации строки под-
строкой другого объекта класса
basic_string
. Эта подстрока за-
дается интервалом итераторов
[first, last)
(такое обозначение
говорит о том, что левая граница входит в интервал, а правая —
нет). Параметр
al
задает распределитель памяти для элементов
строки.
Глава 39. Работа со строками в С++ <string>
435
Например:
string s("aaa bbb");
string::iterator it_beg = s.begin(), it_end = s.end();
string d(it_beg + 1, it_end - 1);
cout << d << endl; // aa bb
39.2.5. Операторы присваивания
В шаблоне класса
basic_string
перегружены оператор присваи-
вания:
basic_string& operator=(const basic_string& rhs);
basic_string& operator=(const value_type *s);
basic_string& operator=(value_type c);
То есть строкам можно присваивать значения других строк, строк
языка программирования С и отдельных символов. Например:
string s;
string t("Some string");
s = 'a';
s = "Demo string";
s = t;
39.2.6. Функции,
возвращающие итераторы
В шаблоне класса
basic_string
определены следующие функции-
члены, возвращающие итераторы элементов строки:
iterator begin();
const_iterator begin() const;
iterator end();
const_iterator end() const;
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
reverse_iterator rend();
const_reverse_iterator rend() const;