хранящий в себе коллекцию элементов заданного типа. Последовательные контейнеры (sequence containers) — это типы контейнеров, которые позволяют контролировать порядок, в котором хранятся элементы и предоставляется доступ к ним. • Определены в библиотеке Standard Template Library, в пространстве имён std; • Осуществляют эффективное управление памятью; • Объединены единым интерфейсом.
в начало Вставка в конец Вставка в произвольное место Удаление из начала Удаление из конца Удаление из произвольног о места std::vector / std::string O(1) O(N) O(1) O(N) O(N) O(1) O(N) std::list / std::forward _list Начало / конец / по итератору: O(1); Индекс: O(N) O(1) O(1) по итератору: O(1); Индекс: O(N) O(1) O(1) по итератору: O(1); Индекс: O(N) std::deque O(1) O(1) O(1) O(N) O(1) O(1) O(N) Таблица 1. Сложность различных операций с контейнерами.
определяют функций вроде sort, find, fill, for_each, etc.? Такой подход очень плохо масштабируется: ➢ Функции придётся определять для каждого контейнера; ➢ Если мы решим написать новый контейнер, реализацию этих функций придётся написать заново; ➢ Пользователю придётся писать свои реализации этих функций.
синтаксически ведут себя, как указатели на элементы контейнера. • Можно получить посредством функций cbegin(), begin(), cend(), end(); • Как контейнеры обладают общим интерфейсом; • Поддерживают операторы инкремента и декремента (кроме случаев, когда не поддерживают; • Поддерживают операторы сравнения (==, >=, <=, >, <); • iterator поддерживает запись, в то время, как const_iterator поддерживает только чтение.
читающий значения из потока in_stream. • istream_iterator<T> in_iterator — конструктор по умолчанию создаёт итератор, указывающий на конец потока. • Для чтения из потока используется оператор инкремента, который читает следующее значение, используя оператор >>, определённый для потока. • Можно создать для любого типа, в котором определён оператор >>.
пишущий значения в поток out_stream. • Запись в поток осуществляется посредством оператора присваивания =. • Операторы *out_iterator, ++out_iterator, out_iterator++ определены, но возвращают только out_iterator.
push_back front_inserter push_front Итераторы вставки — специальные итераторы, которые служат для записи новых элементов в контейнер при помощи адаптеров inserter, back_inserter, front_inserter. • Вызов *it = elem; вставляет место, на которое ссылается итератор элемент elem.
чтение, но не запись; поддерживает только инкремент. Итератор вывода Обеспечивает запись, но не чтение; поддерживает только инкремент. Прямой итератор Обеспечивает чтение и запись; поддерживает только инкремент. Двунаправленный итератор Обеспечивает чтение и запись; поддерживает инкремент и декремент. Итератор произвольного доступа Обеспечивает чтение и запись; поддерживает любые операции итераторов.
определены в заголовке <algorithm>: • Содержит более 100 функций, которые служат для обработки коллекций элементов; • Содержит заголовок <numeric>, в котором определен набор обобщённых числовых алгоритмов; • Имеет единообразную структуру; • В качестве параметров функции библиотеки принимают итераторы;
= 0, b = 0, c = 0, d = 0; return […]() {return a + b + c; }(); } […] Результат [] Ошибка: нельзя ссылаться на локальную переменную в теле лямбды. [=] a, b, c захвачены по значению. [&] a, b, c захвачены по ссылке. [=, &a, &b] a, b захвачены по ссылке, все остальные переменные в теле лямбды — по значению. [&, c] с захвачена по значению, все остальные переменные в теле лямбды — по ссылке.
{ auto a = 0, b = 0, c = 0, d = 0; auto f = [&a, b, &c, d] {return 1000 * a + 100 * b + 10 * c + d; }; a = 2; b = 2; c = 2; d = 2; cout << f(); return 0; }
= 4; auto func = [](int a, int b, int c, int d, int e) {return a + b + c + d + e; }; auto binded_func = bind(func, 1, placeholders::_1, e, placeholders::_3, placeholders::_2); cout << binded_func(0, 0, 0); return 0; } Функция bind()
единым правилам формулирования сигнатур: 1. Большинство алгоритмов следуют следующим формам: 1. alg(beg, end, parameter_list); 2. alg(beg, end, dest, parameter_list); 3. alg(beg, end, beg2, parameter_list); 4. alg(beg, end, beg2, end2, parameter_list); 2. Если алгоритм использует операторы == или < и не имеет других параметров, диапазона, то этот алгоритм перегружается следующим образом: alg(beg, end); alg(beg, end, predicate); 3. Если алгоритм получает значение элемента, то обычно у этого алгоритма есть версия с суффиксом _if, которая принимает предикат. 4. Некоторые алгоритмы имеют копирующие версии, обозначенные суффиксом _copy.