Задание 1 (общее): шаблоны функций

Указание: каждый из пунктов задания должен быть оформлен в отдельном заголовочном файле. Также должен быть один исходный модуль с функцией main(), в которой выполняется тестирование всех реализованных шаблонных функций.

  1. Написать шаблонную функцию, которая находит сумму элементов вектора. Тип элементов должен поддерживать копирование при помощи конструирования, операцию += и инициализацию значением (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;
      } 
    };
    
  2. Написать шаблонную функцию, которая находит сумму элементов в полуинтервале, заданном итераторами начала и конца. Итераторы должны удовлетворять требованиям стандарта для входных итераторов. Проверить работу функции необходимо на итераторах ввода из строкового потока:

      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;
    
  3. Написать шаблонную функцию, которая находит среднее арифметическое элементов типа int, хранящихся в произвольном контейнере (шаблонный шаблонный параметр), удовлетворяющем требованиям стандартных контейнеров. Проверить работу функции необходимо на шаблонах std::vector <>, std::list <> и std::set <>.

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

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