Главная идея изложенного ниже в следующем.
Мне не нравятся попытки инициализировать многомерные массивы динамически, будь то вектора или простые массивы,
прямо в коде. Это выглядит чрезвычайно громоздко, длинно, а главное, не очень понятно:
vector < vector < vector < int >>> arr (
2 ,
vector < vector < int >> (
3 ,
vecotr < int > ( 5 , 0 )
)
);
Поэтому я попытался вынести всю эту работу в одну функцию, которую мы вам разрешаем использовать…
Только вот пытаться понять, что тут происходит, не надо ;)
#include <bits/stdc++.h>
namespace ldv {
using std :: vector ;
using std :: size_t ;
template < typename T , typename ... Args >
struct __init_vectors_of ;
template < typename T >
struct __init_vectors_of < T > {
using type = T ;
static inline type get ( T const & value ) {
return value ;
}
};
template < typename T , typename Head , typename ... Tail >
struct __init_vectors_of < T , Head , Tail ... > {
using under = __init_vectors_of < T , Tail ... > ;
using inside = typename under :: type ;
using type = vector < inside > ;
static inline type get ( T const & value , Head head , Tail ... tail ) {
return type ( head , under :: get ( value , tail ...));
}
};
template < typename T , typename ... Args >
struct __init_array_of ;
template < typename T >
struct __init_array_of < T > {
using type = T ;
static inline type get ( T const & value ) {
return value ;
}
};
template < typename T , typename Head , typename ... Tail >
struct __init_array_of < T , Head , Tail ... > {
using under = __init_array_of < T , Tail ... > ;
using inside = typename under :: type ;
using type = inside * ;
static inline type get ( T const & value , Head head , Tail ... tail ) {
type p = new inside [ head ];
for ( size_t i = 0 ; i != head ; ++ i ) {
p [ i ] = under :: get ( value , tail ...);
}
return p ;
}
};
/**
* Usage: init_vectors_of(default value, <sizes of dimensions>)
*/
template < typename T , typename ... Args >
inline typename __init_vectors_of < T , Args ... >:: type init_vectors_of ( T const & value , Args ... sizes ) {
return __init_vectors_of < T , Args ... >:: get ( value , sizes ...);
}
/**
* Usage: init_array_of(default value, <sizes of dimensions>)
*/
template < typename T , typename ... Args >
inline typename __init_array_of < T , Args ... >:: type init_array_of ( T const & value , Args ... sizes ) {
return __init_array_of < T , Args ... >:: get ( value , sizes ...);
}
}
using ldv :: init_vectors_of ;
using ldv :: init_array_of ;
using std :: vector ;
int main () {
// Создать 2-элементный вектор из 3-элементных векторов из 5-элементных векторов из нулей:
vector < vector < vector < int >>> arr = init_vectors_of < int > ( 0 , 2 , 3 , 5 );
// То же самое на массивах:
int *** arr2 = init_array_of < int > ( 0 , 2 , 3 , 5 );
}