Файл input.txt, деки, список двусторонняя очередь

Проверьте, пожалуйста, задачу. В частности не понятно про аргумент в качестве файла, и в main - как это выводится в файл. P.S. у меня еще написана функция Add_Max_Min_Avarage, но это доп. задание, там надо добавить к каждому элементу контейнера среднее максимального и минимального. Их я нашел, но как добавить к каждому элементу?

введите сюда описание изображения

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <vector>
#include <deque>
#include <list>
#include <algorithm>
#include <iterator>
#include <cmath>
 
void File(int N, int count){
 
    std::ofstream out("input.txt");
 
    for (int i = 1; i <= count; ++i) {
        out << rand() % (2 * N + 1) - N << std::endl;
    }
 
    std::cout << "File is done!" << std::endl;
}
///////////
**
template <class T>
T& inputfile(const std::string& File) {
    
    std::vector<int> vec; //??
    std::fstream in(File);
    if (!in.is_open()) std::cout << "Cannot open file!\n";
    else {
        for (int x; in >> x; ) {
            T.push_back(x);
        }
    }
    return T;
}
**
///////////
 
std::vector<int> inputfile_to_vector() {
    std::vector<int> vec;
 
    std::fstream in("input.txt", std::fstream::in | std::fstream::out);
 
    if (!in.is_open()) std::cout << "Cannot open file!\n";
    else {
        for (int x{}; in >> x; ) {
            vec.push_back(x);
        }
    }
    return vec;
}
 
std::deque<int> inputfile_to_deque() {
    std::deque<int> deq;
 
    std::fstream in("input.txt", std::fstream::in | std::fstream::out);
 
    if (!in.is_open()) std::cout << "Cannot open file!\n";
    else {
        for (int x{}; in >> x; ) {
             deq.push_back(x);
        }
    }
    
    return deq;
}
 
std::list<int> inputfile_to_list() {
    std::list<int> list;
 
    std::fstream in("input.txt", std::fstream::in | std::fstream::out);
 
    if (!in.is_open()) std::cout << "Cannot open file!\n";
    else {
        for (int x; in >> x; ) {
            list.push_back(x);
        }
    }
    return list;
}
 
template <class T>
T& Modify(T& X) {
 
    std::ofstream out("input.txt");
 
    int First_Odd = 0;
 
    for (const auto& i : X) {
        if (std::abs(i) % 2 == 1) {
            First_Odd = i;
            break;
        }
    }   
    return X;
}
 
template <class T>
 void Add_Sum_Avarage(T& conteiner) {
    
    typename T::iterator pos;
    int S = 0, N = 0;
    double SA = 0;
 
    for (pos = conteiner.begin(); pos != conteiner.end(); ++pos) {
        S += *pos;
        SA += *pos;
        N++;
    }
    
    conteiner.push_back(S);
    conteiner.push_back(SA / N);
 
    std::cout << "Sum of container = " << S << std::endl;
    std::cout << "Average of container = " << (SA / N) << std::endl;
    std::cout << "Sum and average were add to container!" << std::endl;
}
 
 template <class T>
 void Add_Max_Min_Avarage(T& conteiner) {
    typename T::iterator pos;
     int MAX = 0;
     int MIN = 0;
     int S2 = 0;
     typename T::iterator pos1;
     typename T::iterator pos2;
     typename T::iterator ii;
 
     for (pos1 = conteiner.begin(); pos1 != conteiner.end(); ++pos1)
         if (MAX < *pos1) MAX = *pos1; std::cout << "\nMAX = " << MAX << std::endl;
 
     for (pos2 = conteiner.begin(); pos2 != conteiner.end(); ++pos2)
         if (MIN > * pos2) MIN = *pos2; std::cout << "MIN = " << MIN << std::endl;
 
     double Avarage = (MAX + MIN) / 2.0;
     std::cout << "Avarage of max and min = " << Avarage << '\n' << std::endl;
 
     conteiner.push_back(MAX);
     conteiner.push_back(MIN);
     conteiner.push_back(Avarage);
 }
 
int Random() { return rand() % (2 * 50 + 1) - 50; }
 
template <class T>
void display(const T& x) {
    std::ofstream out("input.txt");
    for (const auto& i : x) out << i << " ";
    out << '\n';
}
 
int main(){
    srand(time(NULL));
    
    File(50, 5);
 
    std::cout << "Making of container..." << std::endl;
    std::vector<int> V = inputfile_to_vector();
    std::deque<int> D = inputfile_to_deque();
    std::list<int> L = inputfile_to_list();
 
    std::cout << "Changing of container..." << std::endl;
    
    Modify(V);
    display(V);
 
    Add_Sum_Avarage(D); 
    display(D);     
}

Ответы (1 шт):

Автор решения: EOF

Никак Вы меня не поймёте:) Все Ваши функции inputfile_to_ отличаются только типом используемого контейнера. Все эти функции можно заменить одним шаблоном:

template <typename Container>
Container inputfile()
{
    Container cont;
 
    std::fstream in("input.txt", std::fstream::in | std::fstream::out);
 
    if (!in.is_open())
        std::cout << "Cannot open file!\n";
    else {
        for (int x{}; in >> x; ) {
            cont.push_back(x);
        }
    }
    return cont;
}

А в main вызывать примерно так:

std::vector<int> V = inputfile<std::vector<int>>();
std::deque<int> D = inputfile<std::deque<int>>();
std::list<int> L = inputfile<std::list<int>>();
→ Ссылка