Члены последовательных контейнеров stl
SEQ::SEQ(n, v) n элементов со значением v
SEQ: : SEQ (b_it, e_it) от b_it до e_it - 1
с . insert (w_it, v) вставка v nepenw_it
с . insert (w_it, v, п) вставка п копий v nepenw_it
с . insert (w_it, b_it, e_it) вставка значений от b_it
до e_it перед w_it
с . erase (w_it) стирает элемент,
«прописанный» Bw_it
с . erase (b_it, e_it) стирает от b_it Aoe_it
Вот некоторые примеры использования этих членов:
double w [6] = (1.1, 1.2, 2.2, 2.3, 3.3, 4.4);
vector<double> v(15, 1.5); //15 элементов со значением 1.5
deque<double> d(w + 2, w + 6); //использует от 2.2 до 4.4
d.erase(d.begin() + 2); //стирает 3-ий элемент
v.insert(v.begin () + 1, w[3]); //вставляет w[3]
Ассоциативные контейнеры
Ассоциативные контейнеры — это множества, отображения, мультимножества и мультиотображения. Они содержат доступные по ключу элементы и упорядочивающее отношение Compare, являющееся сравнивающим объектом ассоциативного контейнера.
Это стандартная идиома прохода при использовании контейнеров и итераторов. Заметьте, что d. end () используется для выхода из цикла, поскольку является значением итератора «конец контейнера». Обратите также внимание, что автоинкремент ++ имеет семантику указателя, продвигая итератор к следующей позиции в контейнере. Разыменование работает аналогично семантике указателей.
• d. insert (d.begin (), v.begin(), v.end());
Функция-член insert () помещает диапазон значений итератора от v. begin () до v. end () (исключая само v. end () ) начиная с позиции d. beg in ().
• for (p = d.begin(); p i= d.end(); p++)
cout << *p << ' \t ' ; //печать: 6 6 6 6 6 6 8 7 6 5
Вследствие вставки пяти новых элементов со значением 6 в начало двусторонней очереди d, теперь цикл прохода для d выведет 10 элементов, что и показано в комментарии.
В следующей таблице последовательные классы обозначены как SEQ. Имейте в виду, что приведенные ниже возможности дополняют уже описанный интерфейс любого CAN.
Члены последовательных контейнеров stl
SEQ::SEQ(n, v) n элементов со значением v
SEQ: : SEQ (b_it, e_it) от b_it до e_it - 1
с . insert (w_it, v) вставка v nepenw_it
с . insert (w_it, v, п) вставка п копий v nepenw_it
с . insert (w_it, b_it, e_it) вставка значений от b_it
до e_it перед w_it
с . erase (w_it) стирает элемент,
«прописанный» Bw_it
с . erase (b_it, e_it) стирает от b_it Aoe_it
Вот некоторые примеры использования этих членов:
double w [6] = (1.1, 1.2, 2.2, 2.3, 3.3, 4.4);
vector<double> v(15, 1.5); //15 элементов со значением 1.5
deque<double> d(w + 2, w + 6); //использует от 2.2 до 4.4
d.erase(d.begin() + 2); //стирает 3-ий элемент
v.insert(v.begin () + 1, w[3]); //вставляет w[3]
Ассоциативные контейнеры
Ассоциативные контейнеры — это множества, отображения, мультимножества и мультиотображения. Они содержат доступные по ключу элементы и упорядочивающее отношение Compare, являющееся сравнивающим объектом ассоциативного контейнера.
В файле stl_age.cpp
//Ассоциативные контейнеры — поиск возраста
#include <iostream>
#include <map>
#include <string>
using namespace std;
int main()
{
map<string, int, less<string> > name_age; //имя и возраст
name_age [ "Пол, Лаура"] =7; :
name_age["Долсберри,Бетти"] = 39;
name_age["Пол,Таня"] = 14;
cout << "Лауре "<< name_age["Пол,Лаура"] << " лет." « endl;
}
Отображение name_age — это ассоциативный массив, в котором ключом является тип string. Объект Compare — это less<string>.
В следующей таблице, описывающей интерфейс ассоциативных классов, они обозначены как ASSOC. Имейте в виду, что приведенные ниже возможности дополняют уже описанный интерфейс любого CAN.
Определения ассоциативных контейнеров STL
ASSOC : : key_type тип ключа поиска
ASSOC :: key_compare тип сравнивающего объекта
ASSOC:: value_compare тип для сравнения
ASSOC::value_type
Инициализация ассоциативных контейнеров обеспечивается несколькими стандартными конструкторами.
Ассоциативные конструкторы STL
assoc () конструктор по умолчанию,
используется Compare
ASSOC (cmp) конструктор, использующий стр
как сравнивающий объект
ASSOC (b_it, e_it) использует элементы в диапазоне
от b_it до e_it применяется Compare
ASSOC (b_it, e_it, cmp) использует элементы в диапазоне
от b_it до е_it и cmp как
сравненивающий объект
Что отличает эти конструкторы от конструкторов последовательных контейнер так это использование.
STL: функции-члены вставки и удаления
с . insert (t) если ни один из существующих элементов не имеет такого же ключа, как t, вставляет t;
возвращает пару <iterator, bool> с bool, имеющим значение true, если t отсутствовал
с . insert (w_it, t) вставляет t с w_it в качестве ; начальной позиции поиска; терпит неудачу в множествах
и отображениях, если ключевое значение уже. присутствует;
возвращает позицию вставки
с . insert (b_it, e_it) вставляет диапазон элементов
с . erase (k) стирает элементы, ключевое значение которых равно k, возвращая количество стертых элементов
с . erase (w_it) стирает указываемый элемент с . erase (b_it, e_it) стирает диапазон элементов
Вставка выполняется, если ни один из элементов с таким же ключом еще не присутствует. Вот некоторые примеры использования этих членов:
int т[4]={1,2,3,4};
set<int, less<int> > s //множество целых,
//упорядоченное
//с помощью less
se't<int, less<int> > t(m, m + 4); //используется 1, 2, 3, 4
s.insert(3); //помешает 3 в множество s
t.insert (3); //не вставляется, так как
//в множестве t уже есть 3
s.erase(2); //в s нет такого элемента
t.erase(4); //t теперь содержит 1, 2, 3
Дополнительные функции-члены можно найти в разделе E.I.2, «Ассоциативные контейнеры», на стр. 423.
Адаптеры контейнеров
Классы адаптеров контейнеров (container adaptors) — это контейнерные классы, которые изменяют имеющиеся контейнеры с тем, чтобы обеспечить иное открытое поведение на основе существующей реализации. Три предлагаемых адаптераконтейнеров — это stack (стек), queue (очередь) и priority_queue (приоритетная очередь).
Стек может быть получен (адаптирован) из вектора, списка и двусторонней очереди. Он нуждается в реализации, поддерживающей операции push, pop и tор.