2017-02-25 15 views
-2

私はHackerrankのためのプログラミングの問題に取り組んでいます。 https://www.hackerrank.com/challenges/30-2d-arrays。私はすでにこの問題を解決しましたが、優れた開発者のように、最速のコード実行のための2dデータ構造を作成するベストプラクティスのアドバイスを探しています。ベクトル対2D配列vs int *を持つ構造体の配列。

問題は非常に簡単であり、かつ2次元配列内の形状を定義し、その形状のすべてのオカレンスの最大値をカウントするように依頼します。

そこで、最初に、代わりにそれらは、テンプレートに設けられていたようなベクターを用いて、私は2次元配列を使用します。しかし、私はポインタでいくつかの訓練を持っているので、私はこのような構造体のポインタを持つ2次元配列をした:

  1. は普通の古い2Dアレイを使用してより良い私の解決策ですか?
  2. もしそうなら、私もさえ大きなプロジェクトのための努力をすべきではありませんか?
  3. ない場合は、ときに私は(今まで)この種のものを選ぶべきですか?

あなたが唯一の固定サイズの2次元配列が必要な場合は事前

#include <iostream> 
using namespace std; 

struct row { 
    signed int * usePointers; 
}; 

int main() { 
    int highest = -324; 
    int next; 

    row* chart; 
    chart = new row[6]; //allocate all rows first 

     for (int arr_i = 0; arr_i < 6; arr_i++) { 
      chart[arr_i].usePointers = new int[6]; //allocate each column here 

      for (int arr_j = 0; arr_j < 6; arr_j++) { 
       chart[arr_i].usePointers[arr_j] = 0; //fill each element here 
       cin >> chart[arr_i].usePointers[arr_j]; 
      } 
     } 

     //create the hourglass (n-3)*(n-3) times 
     for (int arr_i = 0; arr_i <=3; arr_i++) { 
      for (int arr_j = 0; arr_j <=3; arr_j++) { 
       next = 0; 
       //top 
       next += chart[arr_i].usePointers[arr_j] + 
        chart[arr_i].usePointers[arr_j+1] + 
        chart[arr_i].usePointers[arr_j+2]; 

       //mid 
       next += chart[arr_i+1].usePointers[arr_j + 1]; 

       //bottom 
       next += chart[arr_i+2].usePointers[arr_j] + 
        chart[arr_i+2].usePointers[arr_j + 1] + 
        chart[arr_i+2].usePointers[arr_j + 2]; 

       if (next > highest) 
        highest = next; 

       //cout << chart[arr_i].usePointers[arr_j]; 
      } 
     } 
     cout << highest; 

     free(chart); 

    return 0; 
} 
+0

あなたのソリューションが動作する場合、あなたはより良い[codereview.se]でこの質問をすると思います。 – ForceBru

+0

迷惑メールのタグを使わないでください!これは明らかにCではありません。そして、「新しい2D配列」は何ですか? – Olaf

+0

私はCスタイルの構造体を使用し、ダブルポインタを作成しました。私はコードの領域がC開発者にはよく知られていると思った。 また、スレッド内で「新しい2D配列」と言うだけでなく、引用符を乱用しないでください。私はそれを検索したので、あなたの質問に答えて何も見つかりませんでした。 – Crawsome

答えて

1

でのおかげで、あなたはおそらく、単にint a[6][8]のようなものを使用する必要がありますし、それを行っています。動的な2D配列が必要な場合は、通常、配列を1つの連続したメモリブロックとして割り当て、配列要素にアクセスするために必要なオフセット計算を自分で実行する方が効率的です。配列がメモリの複数の異なる領域に配置されるため、ポインタの配列がうまくいかず、CPUのキャッシュアルゴリズムを無効にする可能性があります。

関連する問題