4 Контейнеры list и deque
Список (list) - это последовательность, оптимизированная для вставки и удаления элементов. Однако следующие операции, характерные для списков, доступны и для других последовательностей:
insert(p, x) - добавление х перед p;
insert(p, n, x) - добавление n копий х перед p;
insert(p, first, last) - добавление перед p элементов последовательности, заданной итераторами first и last;
erase(p) - удаление элемента в позиции p;
erase(first, last) - удаление последовательности, заданной итераторами;
clear() - удаление всех элементов.
Контейнер deque - это очередь с двумя концами. Эта последовательность оптимизирована таким образом, что операции с обоими концами эффективны, как в списке, а обращение по индексу приближается по своей эффективности к вектору.
Для контейнеров list и deque имеются операции push_front() - добавление нового первого элемента и pop_front() - удаление первого элемента.
5 Строки стандартной библиотеки
Строки стандартной библиотеки аналогичны векторам, специализированным для работы с последовательностями символов. Для работы со строками необходимо подключить заголовочный файл <string>. Строку можно проинициализировать по умолчанию (пустой строкой), цепочкой символов, другой строкой типа std::string:
string s1;
string s2("a string");
string s3 = "initial value";
string s4(s3);
Можно также, установив размер строки, заполнить ее заданным символом, либо проинициализировать строку другой последовательностью, используя пару итераторов:
string s7(10, '\n');
string s8(aList.begin(), aList.end());
Как и векторы, строки характеризуются логической и физической длиной. Эти величины можно получить с помощью функций-элементов size() и capacity(). Функция-элемент reserve() меняет физическую длину строки. Функция-элемент max_size() возвращает максимальный размер строки, которая может быть размещена в памяти. Функция-элемент length() - синоним функции size().
С помощью функции-элемента resize() изменяется текущая длина строки. Вторым параметром функции можно указать символ, вставляемый в новые позиции.
s7.resize(15, '\t'); // вставка символов табуляции
Функция-элемент empty() возвращает true, если строка не содержит символов.
Доступ к отдельным символам в строке аналогичен доступу к элементам массива:
s = "string";
s[1] = 'p'; // s == "spring"
Строке может быть присвоено значение другой строки, массива символов, или отдельного символа:
s1 = s2;
s2 = "a new value";
s3 = 'x';
Оператор += может быть использован для всех трех форм присваивания.
С помощью функций-элементов assign() и append() можно выделить часть присваиваемой последовательности символов:
s4.assign(s2, 0, 3);// присваивание первых трех символов
s4.append(s5, 2, 3);// добавление символов 2, 3 и 4
Оператор + осуществляет сшивание двух строк. Функция-элемент swap() обменивает содержимое двух строк.
Доступ к символам может быть осуществлен с помощью операции [] или функции at(). Функция at() генерирует исключение out_of_range, если осуществлена попытка получения символа за пределами строки.
Для строк не реализовано их приведение к типу char* по умолчанию. Функция-элемент c_str() возвращает указатель на оканчивающийся нулем массив символов.
Для вставки, удаления и замены символов используются функции-элементы insert(), erase() и replace():
s3.insert(3, "abc"); // вставка abc после позиции 3
s3.erase(4, 2); // удаление позиций 4 и 5
s3.replace(4, 2, "pqr");// замена позиций 4 и 5 на pqr
Функция-элемент copy() копирует в строку символы из указанного диапазона:
// Присваивает s4 позиции от 2 до конца s3:
s3.copy(s4, 2);
// Присваивает s4 позиции от 2 до 4 строки s5 :
s5.copy(s4, 2, 3);
Функция-элемент compare() используется для лексикографического сравнения строк. Необязательные аргументы могут задавать различные исходные позиции для сравнения. Функция возвращает отрицательное значение, если получатель меньше аргумента, ноль, если они равны, и положительное в противном случае.
Чаще используются операции сравнения <, <=, ==, !=, >=, и >, которые также могут использоваться для сравнения с цепочкой символов.
Функция-элемент substr() возвращает строку, являющуюся частью исходной. При этом также задается диапазон индексов:
cout << s4.substr(3); // вывод от позиции 3 до конца
cout << s4.substr(3, 2);// вывод позиций 3 и 4
Функция-элемент find() определяет первое включение аргумента в текущую строку. Необязательный целый аргумент определяет стартовую позицию для поиска Функция возвращает найденную позицию или значение за пределами индекса. Функция rfind() ищет с конца в обратную сторону.
s1 = "mississippi";
cout << s1.find("ss"); // возвращает 2
cout << s1.find("ss", 3); // возвращает 5
cout << s1.rfind("ss"); // возвращает 5
cout << s1.rfind("ss", 4); // возвращает 2
Если подстрока не найдена, возвращается значение, большее длины строки.
