我长期以来在C程序中使用指向数组的指针:
int (*myarray)[2] = (int (*)[2]) malloc(n*sizeof(int[2]));
但是,如何使用new在C ++中执行此操作?我可以这样做吗?
int (*myarray)[2] = (int (*)[2]) new int[n][2];
编辑:
看起来我原来的帖子不完整且令人困惑。这是一个我编译和测试的代码片段似乎做了正确的事情,但我想从C ++专家那里确认我使用的是适当的C ++构造。
#include <iostream>
int main() {
int n=5;
int (*A)[2] = new int[n][2];
for (int i = 0; i < n; i++)
for (int j = 0; j < 2; j++)
A[i][j] = 2*i+j;
for (int i = 0; i < n; i++)
std::cout << A[i][0] << " " << A[i][1] << "\n";
delete myarray;
}
答案 0 :(得分:3)
使用C ++和STL的乐趣是你得到一个提供类似行为的数组的向量类。 这也使管理和阅读更容易......
std::vector< std::vector<int> > myarray(n);
如果您不想使用STL,那么总会有......
typedef int intarray[2];
intarray* ints = new intarray[n];
ints[0][0] = 1;
...
ints[n-1][1] = 6;
如果代码更容易阅读,我个人会写一些额外的代码。
答案 1 :(得分:2)
我认为做你要求的最明智的方法是对数组使用typedef:
typedef int array_t[2];
array_t* yourarray = new array_t[n];
不要这样做,因为它需要进行手动内存管理,并且往往是单调乏味,容易出错和易碎,特别是在异常安全方面。相反,请查看std::array
类模板(C ++ 11中的新模板,但可通过Boost获得)和std::vector
类模板。
为了阐明在容器中存储std::vector
和std::array
之间的区别,后者通常在涉及的元素数量较少且数量固定时更有效。原因是数组类不像向量那样动态分配事物。为此,向量需要三个指针(开始,已用存储的结束和已分配存储的结束)以及数据本身的存储(加上可能由分配器引起的一些开销),所有这些都需要加载到CPU缓存中用来。考虑到LP64系统,需要32个字节来存储8个字节的数据,而使用std::array
只需要8个字节。