Скачиваний:
185
Добавлен:
05.07.2021
Размер:
16.53 Mб
Скачать

7. Шаблонный класс array, valarray. Особенности, методы, принципы работы, возможности

Класс шаблона array определенный в заголовочном файле array, не является контейнером STL, поскольку имеет фиксированный размер. Поэтому операции, которые должны были бы изменять размер контейнера, такие как push_back() и insert(), для класса array не определены. Однако определены те функции-элементы, которые имеют для него смысл, например, operator[] и at(). Кроме того, с объектами массивов можно использовать многие стандартные алгоритмы STL, такие как сору() и for_each().

Аrray разработан в качестве замены встроенного типа массива, сочетая в себе компактность и эффективность типа с более удобным и безопасным интерфейсом. Имея фиксированный размер, array не поддерживает push_back() и insert(), но предоставляет ряд других методов STL. В их число входят begin(), end(), rbegin() и rend(), что упрощает применение алгоритмов STL к объектам array.

Класс шаблона valarray, поддерживаемый заголовочным файлом valarray. Этот класс шаблона спроектирован для представления числовых массивов и предоставляет поддержку множества операций с числовыми массивами, такие как добавление содержимого одного массива к другому, применение математических функций к каждому элементу массива и применение к массивам операций линейной алгебры.

Класс valarray перегружает обычные математически функции для принятия объекта valarray в качестве аргумента и возврата объекта valarray, поэтому можно использовать такой оператор:

vad3 = log(vad1);//операция log() перегружена

Или же можно воспользоваться методом apply(), который работает также для неперегруженных функций:

vad3 = vad1.apply(log);

Метод apply() не изменяет вызывающий объект; вместо этого он возвращает новый объект, содержащий результирующие значения.

Простота интерфейса valarray становится еще более очевидной при выполнении многошаговых вычислений:

vad3 = 10.0 * ((vad1 + vad2) / 2.0 + vad1 * cos(vad2));

Класс valarray также предлагает метод sum(), который суммирует содержимое объекта valarray, метод size(), подсчитывающий количество элементов, метод max(), который возвращает наибольшее значение объекта, и метод min(), возвращающий наименьшее значение.

Класс valarray имеет метод resize(), но не осуществляет автоматического изменения размера, подобного тому, которое обеспечивает метод pushback() класса vector. He существует никаких методов для вставки значений, выполнения поиска, сортировки и тому подобных действий. Короче говоря, класс valarray более ограничен, чем класс vector, но его более узкое назначение позволяет иметь намного более простой интерфейс.

8. Шаблонный класс list, forward_list. Особенности, методы, принципы работы, возможности

Список — контейнер с двунаправленным последовательным доступом к элементам. Класс list поддерживает функционирование двунаправленного линейного списка. В отличие от вектора, в котором реализована поддержка произвольного доступа, список позволяет получать к своим элементам только последовательно.

Двунаправленность списка означает, что доступ к его элементам возможен в двух направлениях: от начала к концу и от конца к началу. Шаблонная спецификация класса list выглядит следующим образом.

template <class Type, class Allocator= allocator<Type>> class list

Здесь Type — тип данных, сохраняемых в списке, а элемент allocator означает распределитель памяти, который по умолчанию использует стандартный распределитель.

Таблица – Методы-элементы класса list

Метод

Описание

void assign

Стирает элементы из списка и копирует новый набор элементов в целевой список.

void assign initializer_list<Type> IList); template <class InputIterator>

void assign(InputIterator First, InputIterator Last);

reference back();

const_reference back() const;

Возвращает ссылку на последний элемент списка

const_iterator begin() const; iterator begin();

Возвращает итератор, адресующий первый элемент в списке

void clear();

Удаляет все элементы списка

bool empty() const;

Проверяет, пуст ли список

const_iterator end() const; iterator end();

Возвращает итератор, который обращается к местоположению, следующему за

последним элементом в списке

iterator erase(iterator Where);

iterator erase(iterator first, iterator last);

Удаляет элемент или диапазон элементов в списке из заданных позиций

reference front();

const_reference front() const;

Возвращает ссылку на первый элемент списка

Allocator get_allocator() const;

Возвращает копию объекта распределителя, используемого для построения списка

iterator insert(iterator Where, const Type& Val); iterator insert(iterator Where, Type&& Val); void insert(iterator Where, size_type Count, const Type& Val); iterator insert(iterator Where, initializer_list<Type> IList); template <class InputIterator>

void insert(iterator Where, InputIterator First, InputIterator Last);

Вставляет элемент или ряд элементов или диапазон элементов в список в заданной позиции

size_type max_size() const;

Возвращает максимальную длину списка

void pop_back();

Удаляет элемент в конце списка

void pop_front();

Удаляет элемент в начале списка

void push_back(void push_back(Type&& val);

Добавляет элемент в конец списка

void push_front(const Type& val); void push_front(Type&& val);

Добавляет элемент в начало списка

const_reverse_iterator rbegin() const; reverse_iterator rbegin();

Возвращает итератор, который обращается к первому элементу в перевернутом списке

void remove(const Type& val);

Стирает элементы в списке,

соответствующие заданному значению

template <class Predicate> void remove_if(Predicate pred)

Стирает элементы из списка, для которых выполняется заданный предикат

const_reverse_iterator rend() const; reverse_iterator rend();

Возвращает итератор, который обращается к местоположению, следующему за последним элементом в перевернутом списке

void resize(size_type _Newsize); void resize(size_type _Newsize, Type val);

Задает новый размер для списка

void reverse();

Изменяет порядок расположения элементов в списке в обратном порядке

size_type size() const;

Возвращает количество элементов в списке

void swap(list<Type, Allocator>& right); friend void swap(list<Type, Allocator>& left,

Меняет местами элементы двух списков

list<Type, Allocator>& right)

void merge(list<Type, Allocator>& right); template <class Traits>

void merge(list<Type, Allocator>& right, Traits comp);

Удаляет элементы из списка аргументов, вставляет их в целевой список и упорядочивает новый комбинированный набор элементов в порядке возрастания или в каком-либо другом заданном порядке.

void sort(); template <class Traits> void sort(Traits comp);

Упорядочивает элементы списка в порядке возрастания или по отношению к какомулибо другому заданному пользователем порядку

// insert the entire source list

void splice(const_iterator Where, list<Type, Allocator>& Source);

void splice(const_iterator Where, list<Type,

Allocator>&& Source);

// insert one element of the source list void splice(const_iterator Where, list<Type, Allocator>& Source, const_iterator Iter); void splice(const_iterator Where, list<Type, Allocator>&& Source, const_iterator Iter); // insert a range of elements from the source list

void splice(const_iterator Where, list<Type, Allocator>& Source, const_iterator First, const_iterator Last); void splice(const_iterator Where, list<Type, Allocator>&& Source, const_iterator First, const_iterator Last);

Удаляет элементы из исходного списка и вставляет их в список назначения

void unique(); template <class BinaryPredicate> void unique(BinaryPredicate pred);

Удаляет из списка соседние повторяющиеся элементы или соседние элементы, удовлетворяющие какому-либо другому двоичному предикату

Чтобы достичь максимальной гибкости и переносимости для любого объекта, который подлежит хранению в списке, следует определить конструктор по умолчанию и оператор "<" (желательно определить и другие операторы сравнения). Более точные требования к объекту (как к потенциальному элементу списка) необходимо согласовывать в соответствии с документацией на используемый компилятор.

Один упорядоченный список можно объединить с другим. В результате получится упорядоченный список, который включает содержимое двух исходных списков. Новый список остается в вызывающем списке, а второй список становится пустым.

В С++11 появился новый класс контейнера forward_list (однонаправленный список). Этот класс реализует односвязный список. В таком списке каждый элемент связан только со следующим элементом, но не с предыдущим. Поэтому такой класс требует только однонаправленного, а не двунаправленного итератора.

template <class Type, class Allocator= allocator<Type>> class forward_list

Таким образом, в отличие от vector и list, forward_list не является обратимым контейнером. По сравнению с list, forward_list проще, компактнее, но предлагает меньше возможностей