valarrayを使う上での注意

valarrayは演算子がいろいろ定義されていて3次元幾何を扱うとき便利なのだが、手元では上手く動くのにオンラインジャッジではWAだったりREだったりすることがあった。
何故そうなってしまうのか色々試したり調べたりした結果、
「大きさが違うvalarrayにvalarrayを代入することが出来ない」
ということがわかった。
すなわち、

valarray<double> v;
v = valarray<double>(10);

なんかをするとマズイということ。

// p はサイズ3のvalarray<double>とかで定義されているとする
valarray<double> v = p;

も多分だめ。となると、

valarray<double> v(10);
valarray<double> v(p);

みたいにコンストラクタで指定してやるしかないが、配列を作りたい時どうすればいいか困る。(多分普通のやり方では文法的に定義されてないので無理)
仕方ないので、vectorを使って

vector<valarray<double> > v(50, valarray<double>(10));

としたり、取り敢えず要素数0のvector用意してpush_backしたりすれば配列っぽく扱うことができる。


しかし手元ではなんのエラーも出ず、ジャッジデータと照らし合わせても正しい答えを出力していたので謎だった。

追記

ベクトルの大きさを返す関数としてabsを定義して使っていたが、valarrayのabsはvalarrayをインクルードした時点ですでに定義されている。
自分がabsを定義したときエラーにならなかったのはtypedefで違う名前にしていたからかと思うが、動作がとても怪しいので違う名前にしたほうが無難。