2016-12-30 27 views
1

C++ 11では、1次元ベクトルに対する時間ベクトルはどのようにして2次元ベクトルになりますか?
与えられた2Dベクトルでは、すべての内側ベクトルは同じサイズです。2Dベクトルと1Dベクトル

例:要素がランダムにアクセスされた場合、ベクトルのアバターがより良い実行することになり

std::vector<int> Y(40); 

std::vector<std::vector<int>> X{10, std::vector<int>(4)}; 

+6

時間測定と同様に、気になるシステムで測定する必要があります。 – merlin2011

+0

@ merlin2011私は、C++が1Dと比較して2Dベクトルを最適化するという点で何か違うのだろうかと思っていました。私はいくつかの実行として心配していたので、C++ 11の専門知識が私に間違ったものと仮定してしまうかもしれません。 – letsBeePolite

+1

パフォーマンス測定の第1の規則は、最初の測定が常に間違っていることです。しかし、それが私たちが自信を持つ理由があるまで測定を続けている理由です。 :P – merlin2011

答えて

5

単一のstd::vectorは、本質的に簡単ですが、どこかに格納されたメモリの単なる連続ブロックです。

std::vectorstd::vectorは、より多くのオーバーヘッドを持ちますが、より強力です(たとえば、それぞれの内側のベクトルが異なるサイズになる可能性があるため)。

ランダムアクセス性能は、使用のあなたの特定のパターンのために徹底的にベンチマークする必要がありますが、主な違いは、ということです:あなたはちょうどあなたが2を持っているsize_t index = x + y*WIDTHを計算し、ネストされたベクトルを持つ要素

  • にアクセス

    • 単一のベクターとインダイレクションのレベルでは、まず内部ベクトルを含むメモリを取得しなければならないので、内部ベクトルのデータのメモリを取得する必要があります。
  • +0

    間接的なレベルの間接化は、最近のシステムの大きな要因によって、状況を遅らせる余分なメモリアクセスを招きます。現在の古典的なCPUでは、メモリアクセスに比べて乗算がかなり時間がかかるので、余分な間接化が高速になることがあります。 20年以上前に書かれたコードを見る人もいます。一般的に、可変の行サイズを必要としない限り、今日は悪い習慣です。 – doug

    +0

    コンパイル時に内部サイズまたは外部サイズを知っている場合は、たとえば 'std :: array 、4>'を使用します。あなたが実際に演奏を終えた場合は、スタンドアロン型、OR、 'std :: vector 'からの派生、または合成で新しい行列型を持つことができます。後者を行う場合は、この[リンク](http://stackoverflow.com/questions/4353203/thou-shalt-not-inherit-from-stdvector)をお読みください。 – NameRakes

    関連する問題