web-dev-qa-db-ja.com

c ++ 11 std :: array vs static array vs std :: vector

最初の質問ですが、次の3年間コードを開発する場合、c ++ 11の使用を開始するのは良いことですか?

もしそうなら、Lapackで使用したい場合、マトリックスを実装するための「最良の」方法は何ですか?つまり、_std::vector<std::vector< Type > > Matrix_を実行することはLapackと簡単に互換性がありません。

これまで、行列をType* Matrix(new Type[N])で格納していました(配列のサイズが5のような数値として指定されていないため、newdeleteのポインター形式が重要でした、ただし変数として)。

ただし、C++ 11では、std :: arrayを使用できます。これによると site 、このコンテナが最善の解決策のようです...どう思いますか?

16
PinkFloyd

まず最初に、C++を学ぶ場合は、C++ 11を学びます。以前のC++標準は2003年にリリースされました。つまり、すでに10年前のものです。それはITの世界ではたくさんあります。 C++ 11のスキルは、今後のC++ 1y(おそらくC++ 14)標準にもスムーズに変換されます。

_std::vector_と_std::array_の主な違いは、動的(サイズと割り当て)ストレージと静的ストレージです。したがって、常に4x4の行列クラスが必要な場合は、_std::array<float, 4*4>_で問題ありません。

これらのクラスは両方とも.data()メンバーを提供し、互換性のあるポインターを生成する必要があります。ただし、_std::vector<std::vector<float>>_は連続する16*sizeof(float)メモリを占有しないことに注意してください(したがって、v[0].data()動作しません動作します)。動的なサイズの行列が必要な場合は、単一のvectorを使用して、サイズを_width*height_サイズに変更します。

要素へのアクセスは少し難しくなるため(_v[width * y +x]_または_v[height * x + y]_)、行/列のペアで任意のフィールドにアクセスできるラッパークラスを提供することをお勧めします。

Cスタイルの配列についても言及したので; _std::array_は、同じタイプのストレージを処理するためのより優れたインターフェースを提供するため、優先する必要があります。 _std::array_を超える静的配列で得られるものは何もありません。

18

これは質問に対する非常に遅い回答ですが、誰かがこれを読んだ場合、「ベクトルのベクトル」として行列を実装することはほとんどないことを指摘したいと思います。その理由は、行列の各行がヒープ上のランダムな場所に格納されるためです。これは、行列演算が多くのランダムメモリアクセスを実行してキャッシュミスを引き起こし、実装の速度を大幅に低下させることを意味します。

つまり、パフォーマンスをまったく気にしない場合は、サイズarray/std::array/std::vectorrows * columnsを割り当ててから、整数のペアを配列内の対応する要素に変換するラッパー関数を使用します。行列の行への参照を返すなどのサポートが必要でない限り、これらのオプションはすべて正常に機能するはずです。

15