Задание 2 (индивидуальное): шаблоны функций

  1. Реализовать шаблонную функцию, которая получает на вход любой стандартный контейнер из элементов любого типа и создаёт по нему список (std::list <>) из указателей на элементы этого контейнера, записанные в обратном порядке по отношению к элементам исходного контейнера. Тип указателей в выходном списке должен соответствовать типу элемента во входном контейнере и не должен позволять изменять элемент.

  2. Реализовать шаблонную функцию, которая получает на вход полуинтервал входных итераторов, ссылающихся на элементы любого типа, поддерживающего копирование конструированием и бинарную операцию +, и возвращает вектор (std::vector <>), состоящий из частичных сумм входной последовательности:

    ( x0, x0 + x1, ..., x0 + x1 + ... + xn ).

    Проверить работоспособность функции на данных типа NumberAdd из предыдущего задания.

  3. Реализовать шаблонную функцию, которая получает на вход список (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;
    
  4. Реализовать шаблонную функцию, которая получает на вход любой контейнер из строк (std::string) и создаёт по нему множество (std::set <>) из итераторов исходного контейнера, ссылающихся на все его строки, имеющие максимальную длину.

  5. Реализовать шаблонную функцию, которая получает на вход любую обратимую последовательность из элементов любого типа, поддерживающую метод push_back(), и создаёт по ней последовательность такого же типа из указателей на элементы этой последовательности, записанные в обратном порядке по отношению к элементам исходной последовательности. Тип указателей в выходной последовательности должен соответствовать типу элемента во входной последовательности и не должен позволять изменять элемент. Проверить работоспособность функции на следующем коде:

      vector <int> l1 { 1, 2, 3, 4 };
      auto l2 = make(l1);
      for (auto &rcT : l2)
        cout << ' ' << *rcT;
      cout << endl;
    
  6. Реализовать шаблонную функцию, которая получает на вход полуинтервал входных итераторов, ссылающихся на элементы любого типа, поддерживающего операцию ==, и возвращающую вектор из указателей на эти элементы, заполненный указателями на каждый элемент исходного полуинтервала, отличающийся по значению от всех элементов до него. Проверить работоспособность функции на следующем типе:

    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;
      }
    };