#include <iostream>
#include <list>
#include <numeric>
#include <chrono>
#include <string>
#include <memory>

using namespace std;

template< typename T, template<typename, typename> class Container>
class ContainerTemplate: public Container<T, allocator<T>>
{
public:
    size_t inlet_whole_length()
    {
        size_t result(0);
        for(auto it: *this)
        {
            result+=it.size();
        }
        return result;
    }


    T  whole_inlet_containers2container()
    {
        T result;
        result.reserve(inlet_whole_length());
        for(auto a:*this)result.insert(result.end(), a.begin(), a.end());
        return result;
    }

};

template< typename T, template<typename, typename> class Container>
class ContainerTemplate2: public Container<T, allocator<T>>
{
public:
    size_t inlet_whole_length()
    {
        size_t result(0);
        for(const auto &it: *this) //ссылка важна здесь
        {
            result+=it.size();
        }
        return result;
    }


    T  whole_inlet_containers2container()
    {
        T result;
        result.reserve(inlet_whole_length());
        for(const auto &a:*this)result.insert(result.end(), a.begin(), a.end());
        return result;
    }

};

int main()
{

    const std::size_t Size = 75000;
    ContainerTemplate<string, list> vs;
    ContainerTemplate2<string, list> vs2;

    for (std::size_t i = 0; i < Size; i++)
    {
        auto str = std::string(i,'s');
        vs.push_back(str);
        vs2.push_back(str);
    }
    auto start = std::chrono::high_resolution_clock::now();
    auto str = vs.whole_inlet_containers2container();
    auto end = std::chrono::high_resolution_clock::now();

    std::chrono::duration<double> diff = end-start;
    std::cout << "Time without ref "<< diff.count() << " s\n";

    start = std::chrono::high_resolution_clock::now();
    auto str2 = vs2.whole_inlet_containers2container();
    end = std::chrono::high_resolution_clock::now();
    diff = end-start;
    std::cout << "Time with ref "<< diff.count() << " s\n";
}
