#include <algorithm>
#include <iostream>
#include <iterator>
#include <memory>
#include <numeric>
#include <vector>

using namespace std;

int main() {
	const auto n = 2;

	{
		cout << "vector:\n";

		vector<vector<int>> v_mod(3, vector<int>(n));

		for_each(begin(v_mod), end(v_mod), [](auto& i) {static typename remove_reference_t<decltype(i)>::value_type gen = 0; iota(i.begin(), i.end(), gen); gen += i.size(); });
		for_each(cbegin(v_mod), cend(v_mod), [](const auto& i) {copy(i.cbegin(), i.cend(), ostream_iterator<typename remove_const_t<remove_reference_t<decltype(i)>>::value_type>(cout, " ")); cout << endl;});
	}

	{
		cout << "\nunique_ptr:\n";

		unique_ptr<int[]> v_mod[3];

		for (auto& i : v_mod) {
			i = make_unique<int[]>(n);
		}
		for_each(begin(v_mod), end(v_mod), [&](auto& i) {static remove_extent_t<typename remove_reference_t<decltype(i)>::element_type> gen = 0; iota(i.get(), i.get() + n, gen); gen += n; });
		for_each(cbegin(v_mod), cend(v_mod), [&](const auto& i) {copy(i.get(), i.get() + n, ostream_iterator<typename remove_const_t<remove_reference_t<decltype(i)>>::element_type>(cout, " ")); cout << endl;});
	}

	{
		cout << "\nnew:\n";

		int* v_mod[3];

		for (auto& i : v_mod) {
			i = new int[n];
		}

		for_each(begin(v_mod), end(v_mod), [&](auto& i) {static remove_pointer_t<remove_reference_t<decltype(i)>> gen = 0; iota(i, i + n, gen); gen += n; });
		for_each(cbegin(v_mod), cend(v_mod), [&](const auto& i) {copy(i, i + n, ostream_iterator<remove_pointer_t<remove_const_t<remove_reference_t<decltype(i)>>>>(cout, " ")); cout << endl;});

		for (auto& i : v_mod) {
			delete[] i;
		}
	}
}