toyama1710 blog posts tags categories

多次元のvector作るやつ

categories:


コード

概要

before:

vector<vector<vector<T>>> vec = vector<vector<vector<T>>>(n1, vector<vector<T>>(n2, vector<T>(n3, e)));

after:

auto vec = make_vector({n1, n2, n3}, e);

N次元vectorの宣言に$\Theta (N^2)$回もvectorって書きたくないので嬉しくなった
make_vector({n1, n2, n3}, 0);make_vector({n1, n2, n3}, 0ll); は等価ではないので注意(前者はint型で後者はlong long)
要素数の指定でキャストの嵐になることもあるけどwarning無視したりRustも似たようなものだしなって思ったりすると辛さが薄れる
make_vector<long long>({n1, n2, n3}, 0) みたいに呼び出した方が安全かもしれない

気持ちとか

戻り値の型をautoで推論できるのラムダ式だけだと思ってたので最近まで諦めてた
実行時に型が決まるような仕組みではないので、テンプレート引数Nで次元の数を指定して 1次元, 2次元, 3次元…. のそれぞれの場合で違う関数になるようにしてる

可変引数テンプレートを使った方が実装は楽 その場合 auto vec = make_vector(n1, n2, n3, e); って書くことになるのでうっかり初期値を書き忘れて auto vec = make_vector(n1, n2, n3); とか書いてしまってもコンパイラでミスを検知できない
自分の実装は妙にテクニカルになってしまったのでまあ一長一短