vectorとvalarray

vectorとvalarray、どちらを使うべきか迷ったため、調べてみたところ日本語で読める文献が少ない事に驚きました。

ということで、メモメモっと。



以下、比較表。かなり自信がないため、ツッコミを期待しつつ。

比較事項          vector (STL) valarray (標準C++)
機能 汎用コンテナ 算術計算用コンテナ
性能 高い
極めて高い
利点 多種のアルゴリズムが       
簡単に適用可能
行列演算のための関数
くらいしかない
制限 特になし
格納できる型に制限がある
ある変数を別変数のvalarrayで参照する事を禁止(※1)
連続した領域に値を取る事を保証(※2)



と、かなり雑にまとめました。どちらもランダムアクセスをサポートするため、速度に大差はない、と判断する人が多いようですし、実際そうなります。さらにvectorのが気合いの入った実装になっていることも多いため、大抵はvectorが良いでしょう。

ただし、valarrayの場合、値を直接参照しにいきますが、、vectorの実装では実データの連続性をイテレータで間接的に管理します。C++規約によればvalarrayは一時オブジェクトの生成を最小限にするために関数の階層の深さに制限を加えているそうです。

もちろん、これが速度の差になるような事が殆どないというのが私の経験則ですが。

理由は設計者の立場になったら簡単です。(理解が根本的に間違っていたので仮説を消去しました、コメントによる指摘ありがとうございました)

用途が異なるだけだし、世の中に残るアルゴリズムには必ず利点があるから使い分けろということです。欠点が何一つ無い方式が一つあるならば、他のアルゴリズムは廃れているはずですから・・・。

—-

※1 別の変数を2つ使ってvalarray内の同じメモリアドレスを差すことが出来ないらしい。コンパイラは値のコピーを作成することにより同一の領域を変更する事を回避するとか。Fortranの配列が引数になった場合もこれを保証するから高速だとか。C風に例えるならばmemcopyとmemmoveみたいなもの?

※2 vectorの値は連続した領域に確保することが規約で決まっていません。決まっていないだけで大抵はそうなっているでしょう。つまり、要素の配列インデクスアクセス程度だと、両者は全く差がないコードを生成します。

Leave a Reply

4 コメント - "vectorとvalarray"

更新通知を受け取る »
avatar
並び替え:   新しい順 | 古い順 | 最も評価の多い
ななし
ゲスト

STLのvectorでのソートは、
> 実データをさすポインタだけを並び替える
のではなく、実データを動かします。

ko-numa
ゲスト

>のではなく、実データを動かします。
ありがとう御座います。
認識が間違っていた事を確認しました。
元々会社でvectorかvalarrayかという議論がありまして、C++の規格書を読んだのですがどうもまだ理解できていないようです。訂正を試みましたが、正直自信が無いため無難な話になってしまいました。
これからもご指摘宜しくお願いします。

zak
ゲスト

>*2
INCITS/ISO/IEC 14882:2003 23.2.4 Class template vector / Paragraph. 1
The elements of a vector are stored contiguously,
meaning that if v is a vector where T is some type other than bool,
then it obeys the identity &v[n] == &v[0] + n for all 0 <= n < v.size().
最近の規格では連続領域に確保されるとうたっているようです。

ko-numa
ゲスト

こんにちは。参考になります。
連続を求めるならvalarrayだと見た気がしまして、元を調べてみました。
ISO/IEC IS 14882:1998
http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#69
なるほど、14882:2003の時点で、「Proposed resolution」が追加されたと。しかし、Intel C++ ver.10とVisual C++ 2005は1998年版を元に作られている為、記事は敢えてそのままにしておきます。
ありがとう御座いました。

wpDiscuz