1

我正在尝试使用我想用 new 分配的大型 2D 向量(因为它很大)。

如果我说:

vector< vector<int> > bob;
bob = vector< vector<int> >(16, vector<int>(1<<12,0));
bob[5][5] = 777;

有用。但如果我说:

std::vector< std::vector<int> > *mary;
mary = new vector< vector<int> >(16, vector<int>(1<<12, 0));
mary[5][5] = 777;

它不起作用,我收到错误:

错误 1 ​​错误 C2679:二进制“=”:未找到采用“int”类型右手操作数的运算符(或没有可接受的转换)c:\Users\jsparger\Documents\My Dropbox\ARI\VME_0.01 \VME_0.01\V965.cpp 11 VME_0.01

显然我是 C++ 新手。有人可以解释我需要使用什么语法来执行此操作。mary 是一个指针,所以我明白为什么这不起作用,但是 *mary[5][5] = 由于“新”而不允许的任何内容,对吗?

谢谢您的帮助。这个向量是我现在要使用的,因为它似乎很容易让我的小 c++ 大脑理解,但是如果像这样的大向量是一个坏主意,请随时告诉我,等等。

谢谢一堆。

编辑:我误认为“因为新而不允许”。我不知道我在哪里误读了它,因为它显然有效,而且如果不这样做也没有多大意义。谢谢。

4

3 回答 3

6

无论如何,向量将它们的元素存储在堆上。在堆上分配向量对象本身没有意义,因为它非常小(通常在 32 位机器上为 12 个字节)。

于 2010-07-15T15:09:31.713 回答
6

Ifmary是一个指针,那么您必须在应用下标运算符之前取消引用它:

(*mary)[5][5] = 777;

括号是必需的,因为下标的优先级高于取消引用。

于 2010-07-15T15:09:27.250 回答
2

在纯 C 中,数组和指针是相似的(不一样!),这会导致您的困惑。在纯 C 中,如果您有以下声明:

int array1[100];
int *array2 = (int *)malloc(100*sizeof(int));

您可以以完全相同的方式使用 array1 和 array2。

但是,如果你用 C 写这个:

int (*array3)[100];

这是完全不同的东西。Array3 现在是一个指向数组的指针,不再是指向数组元素的指针,如果你想访问一个元素,你必须这样写:

(*array3)[5] = 123;

在 C++ 中,您实际上正在做类似的事情,第二个“玛丽”是指向向量的指针,而不是指向向量中元素的指针。因此,你必须这样写:

(*mary)[5][5] = 777;
于 2010-07-15T15:13:43.157 回答