beet's soil

競プロのことなど

多重vectorを可変引数テンプレートで


すいばか さんに圧倒的感謝🙏🙏😭🙏🙏

以下C++ のコード

すいばかさん版:型は最後の引数で決まる

template<typename T>
vector<T> make_v(size_t a,T b){return vector<T>(a,b);}

template<typename... Ts>
auto make_v(size_t a,Ts... ts){
  return vector<decltype(make_v(ts...))>(a,make_v(ts...));
}

型をtemplateで指定する版

template<typename T>
vector<T> make_v(size_t a){return vector<T>(a);}

template<typename T,typename... Ts>
auto make_v(size_t a,Ts... ts){
  return vector<decltype(make_v<T>(ts...))>(a,make_v<T>(ts...));
}

グローバルでauto関数が定義できるの知らなかった(ラムダだけだと思い込んでた)

eiyaさんの N次元配列を同じ値で埋めるテンプレ2 を参考にするとfillもできる
N次元配列を同じ値で埋めるテンプレ2 - 永夜の記録

template<typename T,typename V>
typename enable_if<is_class<T>::value==0>::type
fill_v(T &t,const V &v){t=v;}

template<typename T,typename V>
typename enable_if<is_class<T>::value!=0>::type
fill_v(T &t,const V &v){
  for(auto &e:t) fill_v(e,v);
}

githubのリンク
library/vec.cpp at master · beet-aizu/library · GitHub

auto dp=make_v<int>(4,h,w);
fill_v(dp,0);

みたいに使える

これでやっと

vector<vector<vector<int> > > dp(4,vector<vector<int> >(h,vector<int>(w)));

から解放される…!