1

ArrayListがあります

ArrayList[][] gridList = new ArrayList[300][150];
// Where a and b are some values in the range of the ArrayList.
ArrayList al = this.gridList[a][b];

これをC++に変換するにはどうすればよいですか?std::vectorまたはstd::map、std::arrayを使用してみました。私はそれを機能させることができません。

ArrayList al = this.gridList[a][b];

その行は実際に何をしますか?

サイズの配列を作成しますか?

ArrayList al = new ArrayList[a][b]

または、「a」と「b」の値を新しいArrayList「al」にコピーしますか?

助けてください

4

3 に答える 3

2

あなたのコードは、あなたが思っていることをしません。

 ArrayList[][] gridList = new ArrayList[300][150];

arrayこの最初の行はof arrayof を割り当てArrayListます。

 ArrayList al = this.gridList[a][b];

この 2 行目は、gridListのat オフセットArrayListで at オフセットbを取得します。コードはどちらの配列も初期化しないことに注意してくださいarrayaarray

C++ での同等の型は次のようになります。

#include <vector>
#include <array>

std::array< std::array< std::vector<T>, 150>, 300> gridList;

ここTで、ベクトルに格納されている要素の型です。ジェネリックより前の Java では、要素の型を指定せずに ArrayList を定義することしかできなかったことに注意してください。C++ では、このパラメーターは必須です。上記の変数定義は、現在のスコープに対してインスタンス化します。new動的な値に対して (Java のように) ステートメントを使用する必要があり、おそらくそれをスマート ポインターでラップします。

[]グリッドの要素にアクセスするには、次の演算子を使用できます。

 vector v = gridList[a][b];

vectorこれにより、グリッド内の < a,b > の位置にあるコンテンツの完全なコピーが にトリガーされることに注意してくださいv。示唆されているように、より効率的な方法は次のように書くことです。

auto const &al = gridList[a][b];

繰り返しになりますが、Java で使用されるメモリ モデルは非常に動的であるため、コードの動作を Java バージョンに近づけたい場合は、おそらく次のようになります。

 #include<memory>

 typedef std::vector<int> i_vector;
 typedef std::shared_ptr<i_vector> i_vector_ptr;
 typedef std::array< std::array< i_vector_ptr>, 150>, 300> vector_grid;

 typedef std::shared_ptr<vector_grid> vector_grid_ptr;

 vector_grid_ptr gridList;

 i_vector_ptr al = (*gridList)[a][b];

タイプTintで、グリッド タイプの各コンポーネントは明確に定義されています。i_vectorグリッドと各要素 (つまり、ここ)を割り当てる必要があります。

于 2013-03-15T22:24:58.693 に答える
1

このようなものがうまくいくかもしれません(コンテナクラスが必要な場合):

struct Item
{ ...
};

typedef std::vector<Item> ArrayList;

// Single row.
struct ArrayListVector : public std::vector<ArrayList>
{
    ArrayListVector() { resize(150); }
};

// Whole matrix
struct ArrayListMatrix : public std::vector<ArrayListVector>
{
   ArrayListMatrix() { resize(300); }
};

...

ArrayListMatrix gridList;  //< yes, it is 300 x 150
ArrayList &a = gridList[a][b]; //< or, you can make a copy
gridList[b][a] = a; //< assign an entry

それともテンプレートが必要ですか?

ただし、テンプレートやクラスなどを必要としない単純なオプションがあります。

 ArrayList array[300][150]; //< array is allocated (on stack, or statically).
于 2013-03-15T22:19:21.857 に答える
1

ArrayList が「Foo」型の何かを保持している場合:

std::vector<Foo*> gridList[300][150];
std::vector al = this->gridList[a][b];
于 2013-03-15T22:31:56.543 に答える