2014-12-03 108 views
1

如何设置我的数组大小等于我的矢量大小。这里是我的代码:如何将矢量大小分配给数组大小C++?

vector<Point> data_obj; 
int my_array[data_obj.size()] 

,但我得到编译错误说:

error C2057: expected constant expression 
error C2466: cannot allocate an array of constant size 0 

我不理解的错误。你能否提供一些解释?

+1

你不能。 C++中数组的大小需要在编译时知道。无论如何你为什么需要这个?只要继续使用矢量。如果您需要底层数组,请执行'&data_obj [0]'或调用'data_obj.data()'。 – Borgleader 2014-12-03 13:35:33

+0

我只是试图将数组大小设置为等于矢量大小,因此每当矢量数据增加时,数组大小就会随之调整。 – 2014-12-03 13:39:37

+2

@ArsalanSherwani ...阵列不调整。这就是'std :: vector'的用途(为什么你一般使用它)。 – crashmstr 2014-12-03 13:40:26

回答

4

正如错误所述,静态数组的大小在编译时必须保持不变。在运行时可能会改变std::vector的大小,所以数组的大小不能保证是恒定的。你必须做一个动态数组

int* my_array = new int[data_obj.size()]; 

记住后

delete[] my_array; 
+2

尽管制作动态数组的更好方法是'std :: vector my_array = data_obj;'(假设你不能只需使用'data_obj.data()')。 – 2014-12-03 13:38:51

+1

@MikeSeymour这就是这些问题总是倾向于平息的方式。 “我需要一个数组,其大小在编译时不知道,而且在运行时不是恒定的”。所以只需使用矢量!然而,他们从一个矢量开始......所以我们似乎正在倒退:P – CoryKramer 2014-12-03 13:40:23

+0

@Cyber​​在行之间读取他们可能实际需要的是std :: vector :: data() – sjdowling 2014-12-03 13:50:12

0

错误C2057将其删除:预计常量表达式

data_obj.size()不是恒定的,当你分配一个数组,但它应该是 - 这是要求之一。如果你想做这样的事情,你需要动态分配。

错误C2466:不能在这种情况下分配不变的尺寸0

的阵列(当没有把任何东西到向量),它的大小是零。您不能创建大小为0的数组。

+0

你可以创建一个大小为0的数组,但不是静态的:'int * my_array = new int [0];'。 – Noel 2014-12-03 13:40:54

-3

问题在于,通过“经典”语法(例如int a [5])分配的数组在堆栈上分配。因此,编译时需要知道数组的大小,因为编译器需要更改SP(堆栈指针)值。另一方面,vector的内存区域在堆上,就像通过malloc/new分配的数组一样。因此,您可以等待运行时间,以了解您需要多少内存并相应地分配内存。

堆栈/ vs堆分配也有其他优点/缺点:堆栈分配速度更快,因为你只需要减少一个寄存器值,但堆栈的大小是有限的,如果你的数组太大,你最终会堆栈溢出异常,这可能会导致奇怪的事情发生,如创建一个蠕虫洞倾倒HDD上的整个网站:-)。另一方面堆太慢了,太多的分配/释放可能导致片段内存空间。

+0

阵列可以分配到任何地方。 – MSalters 2014-12-04 08:06:56

+0

我指定用new/malloc分配的数组转到堆中,但通过“传统”数组sintax(例如int a [5])分配的数组处于堆栈状态。为什么downvote? – 2014-12-04 08:27:52

+1

好吧,有全局数组,字符串文字(类似全局),堆中的结构数组,静态数组,这些都是“经典语法”,但不在堆栈中。另外,C'99表明,实际上可以通过运行时间量来更改SP,所以它也不是技术约束。 – MSalters 2014-12-04 08:51:54