Задание 2 (индивидуальное): шаблоны функций
Реализовать шаблонную функцию, которая получает на вход любой стандартный контейнер из элементов любого типа и создаёт по нему список (
std::list <>
) из указателей на элементы этого контейнера, записанные в обратном порядке по отношению к элементам исходного контейнера. Тип указателей в выходном списке должен соответствовать типу элемента во входном контейнере и не должен позволять изменять элемент.Реализовать шаблонную функцию, которая получает на вход полуинтервал входных итераторов, ссылающихся на элементы любого типа, поддерживающего копирование конструированием и бинарную операцию
+
, и возвращает вектор (std::vector <>
), состоящий из частичных сумм входной последовательности:( x0, x0 + x1, ..., x0 + x1 + ... + xn ). Проверить работоспособность функции на данных типа
NumberAdd
из предыдущего задания.Реализовать шаблонную функцию, которая получает на вход список (
std::list <>
) из элементов любого типа, поддерживающего копирование конструированием, и строит по нему последовательность, шаблон которой передаётся функции в качестве «шаблонного шаблонного» параметра, состоящий из элементов с теми же значениями. Последовательность должна иметь методpush_back()
. Проверить работоспособность функции на следующем типе:class Copyable { private: int m_n; Copyable &operator = (const Copyable &); public: explicit Copyable(int n) : m_n(n) { } friend std::ostream &operator << ( std::ostream &rOS, const Copyable &rcCopyable) { rOS << rcCopyable.m_n; return rOS; } };
Код вызова и проверки функции может выглядеть следующим образом:
list <Copyable> l2 { Copyable(1), Copyable(2) }; auto d1 = make <std::deque> (l2); for (const auto &rcT : d1) cout << ' ' << rcT; cout << endl;
Реализовать шаблонную функцию, которая получает на вход любой контейнер из строк (
std::string
) и создаёт по нему множество (std::set <>
) из итераторов исходного контейнера, ссылающихся на все его строки, имеющие максимальную длину.Реализовать шаблонную функцию, которая получает на вход любую обратимую последовательность из элементов любого типа, поддерживающую метод
push_back()
, и создаёт по ней последовательность такого же типа из указателей на элементы этой последовательности, записанные в обратном порядке по отношению к элементам исходной последовательности. Тип указателей в выходной последовательности должен соответствовать типу элемента во входной последовательности и не должен позволять изменять элемент. Проверить работоспособность функции на следующем коде:vector <int> l1 { 1, 2, 3, 4 }; auto l2 = make(l1); for (auto &rcT : l2) cout << ' ' << *rcT; cout << endl;
Реализовать шаблонную функцию, которая получает на вход полуинтервал входных итераторов, ссылающихся на элементы любого типа, поддерживающего операцию
==
, и возвращающую вектор из указателей на эти элементы, заполненный указателями на каждый элемент исходного полуинтервала, отличающийся по значению от всех элементов до него. Проверить работоспособность функции на следующем типе:class Comparable { private: int m_n; Comparable &operator = (const Comparable &); public: explicit Comparable(int n) : m_n(n) { } bool operator == (const Comparable &rcOther) { return (m_n == rcOther.m_n); } friend std::ostream &operator << ( std::ostream &rOS, const Copyable &rcCopyable) { rOS << rcCopyable.m_n; return rOS; } };