c++创建数组
C++ creating arrays
为什么我不能这样做呢?
int size = menu.size;
int list[size];
有没有别的方法来代替向量?(数组更快,所以我想使用数组)
谢谢
这个大小必须在编译时知道,因为编译器需要知道需要多少堆栈空间才能为它分配足够的内存。(编辑:我承认错误。在C语言中,可变长度数组可以在堆栈上分配。但是c++不允许变长度数组)
但是,您可以在堆上创建数组:
int* list = new int[size];
只是确保你释放内存当你完成,否则你会得到一个内存泄漏:
delete [] list;
请注意,很容易意外地造成内存泄漏,而vector几乎肯定更容易使用和维护。vector 非常快(特别是如果您首先将它们reserve()
到正确的大小),我强烈建议使用vector而不是手动内存管理。
一般来说,分析代码以找出真正的瓶颈在哪里比预先进行微优化要好(因为优化并不总是优化)。
正如其他人所说,c++语言设计者选择不允许可变长度数组,vla,尽管它们在C99中可用。但是,如果您准备自己做更多的工作,并且您只是迫切需要在堆栈上分配内存,那么您可以使用alloca()
。
也就是说,我个人会使用std::vector
。它更简单、更安全、更易于维护,而且可能足够快。
c++不允许变长度数组。大小必须在编译时已知。所以你不能那样做。
您可以使用向量或new
。
vector<int> list;
或
int *list = new int[size];
如果您使用后者,您需要稍后释放它:
delete[] list;
数组更快,所以我想使用数组
这不是真的。你从哪听来的?
在c++中,数组的长度需要在编译时知道,以便在堆栈上分配它。
如果需要分配一个在编译时不知道其大小的数组,则需要在堆上分配它,使用operator new[]
int size = menu.size;
int *list = new int[size];
但是,由于堆上有新内存,因此您需要确保在使用它时正确删除它。
delete[] list;
在c++ 03中,没有可变长度数组(VLA):
你可能想这样做:
const int size = menu.size;
int list[size]; // size is compile-time constant
或
int *list = new int[size]; // creates an array at runtime;
delete[] list; // size can be non-const
首先,向量并不明显更快。至于你不能这样做的原因:
代码将在堆栈上分配数组。编译器必须事先知道这个大小,这样才能对其进行解释。因此,您只能使用该语法的常量。
一个简单的方法是在堆上创建数组:int list = new int[size];
不要忘记delete[]
。但是,如果您使用矢量并预先保留正确的大小并进行优化编译,则应该很少甚至完全没有开销。
由于list
是在堆栈上分配的,因此它的大小必须在编译时知道。但是这里,size
直到运行时才知道,所以list
的大小在编译时是不知道的。
- 在c++中为double类型的数组创建一个unique_ptr
- 如何从预定义的数组创建某些元素数组
- 基于数组的列表 - 动态数组创建时出错
- 从 UTF-8 字节数组创建字符串?
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 从名称数组创建对象
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 从 std::数组创建十六进制代表
- 在 C++ 结构内声明的数组 A[1] 创建多个实例
- 为多维数组创建内存空间
- 如何使用任何类型的数组创建模板类并为其设置值?
- 从字符串数组创建一个字符数组
- 是否可以在不为该数组创建变量的情况下将数组作为参数传递到函数中?
- 使用类定义数组创建C++类
- 使用具有唯一随机数的结构数组创建多个对象
- 谷歌测试:无法从字符数组创建字符串
- 从 1D 数组创建 2D 数组
- 无法通过一个单向链表数组创建邻接列表
- 如何使用数组创建标准::函数
- 在C++中,返回从本地字符数组创建的字符串是否会导致内存泄漏或未定义的行为