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];

第一行分配了arrayof arrayArrayList

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

第二行检索gridList中ArrayListat 偏移b中的atarray偏移。您应该知道您的代码不会初始化任何一个数组aarray

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> 位置处内容的完整副本 into 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 回答