Задание 1 (общее): шаблоны функций
Указание: каждый из пунктов задания должен быть оформлен в отдельном заголовочном файле. Также должен быть один исходный модуль с функцией main()
, в которой выполняется тестирование всех реализованных шаблонных функций.
Написать шаблонную функцию, которая находит сумму элементов вектора. Тип элементов должен поддерживать копирование при помощи конструирования, операцию
+=
и инициализацию значением (T()
) для возврата ошибочного значения в случае пустого вектора. Проверить работу функции необходимо на следующем типе:class NumberInc { private: int m_n; NumberInc &operator = (const NumberInc &); public: NumberInc() : m_n(-12345678) { } explicit NumberInc(int n) : m_n(n) { } NumberInc &operator += (const NumberInc &rcNumber) { m_n += rcNumber.m_n; return *this; } friend std::ostream &operator << (std::ostream &rOS, const NumberInc &rcNumber) { rOS << rcNumber.m_n; return rOS; } };
Написать шаблонную функцию, которая находит сумму элементов в полуинтервале, заданном итераторами начала и конца. Итераторы должны удовлетворять требованиям стандарта для входных итераторов. Проверить работу функции необходимо на итераторах ввода из строкового потока:
std::istringstream is("1 2 3 4 5 6 7"); int nSum = sum( std::istream_iterator <int> (is), std::istream_iterator <int> ()); std::cout << nSum << std::endl;
Написать шаблонную функцию, которая находит среднее арифметическое элементов типа
int
, хранящихся в произвольном контейнере (шаблонный шаблонный параметр), удовлетворяющем требованиям стандартных контейнеров. Проверить работу функции необходимо на шаблонахstd::vector <>
,std::list <>
иstd::set <>
.Указание: так как шаблоны
std::vector
иstd::set <>
имеют разное количество параметров, необходимо реализовать два перегруженных варианта функции, каждый из которых принимает шаблонный шаблонный параметр с двумя или тремя параметрами.Написать шаблонную функцию, которая находит сумму двух заданных векторов из элементов любого типа, поддерживающего копирование конструированием, бинарную операцию
+
и инициализацию значением (T()
) для возврата вектора ошибочных значений в случае несовпадения размеров входных векторов. Проверить работу функции необходимо на следующем типе:class NumberAdd { private: int m_n; NumberAdd &operator = (const NumberAdd &); public: NumberAdd() : m_n(-12345678) { } explicit NumberAdd(int n) : m_n(n) { } NumberAdd operator + (const NumberAdd &rcNumber) { return NumberAdd(m_n + rcNumber.m_n); } friend std::ostream &operator << (std::ostream &rOS, const NumberAdd &rcNumber) { rOS << rcNumber.m_n; return rOS; } };
Написать шаблонную функцию, которая по вектору из элементов любого типа возвращает другой вектор, в котором эти элементы упорядочены по возрастанию и отфильтрованы от дубликатов. Тип элементов должен удовлетворять требованиям, достаточным для его хранения в
std::set <>
. Реализация функции должна использовать локальную переменную типаstd::set <T>
, в которую необходимо скопировать все элементы входного вектора и которую затем нужно скопировать в выходной вектор.