【发布时间】:2015-03-11 17:21:50
【问题描述】:
我一直在尝试创建一个可变长度的多维数组。据我了解,您不能在堆栈上创建可变长度数组,但您可以使用动态分配在 C++ 中创建一维可变长度数组。如果这是一个编译器扩展,请纠正我,但它似乎在带有 --pedantic 集的 clang 和 gcc 上运行良好。
int size = 10;
int *ary = new int[size]();
我试图将这个概念扩展到多维数组。这是我的结果。可能性 1 和 2 的问题在于它们需要 constexpr 并且不适用于可变大小。是否有可能让它们中的任何一个接受一个变量作为它的大小?我知道可能性 3,但它缺少 [][] 访问权限,这正是我正在寻找的。p>
constexpr int constSize = 10;
//Possibility 1: Only works in C++11
//Creates CONTIGUOUS 2D array equivalent to array[n*n], but with [][] access
int (*ary1)[constSize] = new int[constSize][constSize]();
delete [] ary1;
//Possibility 2:
//Really horrible as it does NOT create a contiguous 2D array
//Instead creates n seperate arrays that are each themselves contiguous
//Also requires a lot of deletes, quite messy
int **ary2 = new int*[constSize];
for (int i = 0; i < n; ++i)
ary2[i] = new int[constSize];
for (int i = 0; i < n; ++i)
delete [] ary2;
delete [] ary2;
//Possibility 3:
//This DOES work with non-constexpr variable
//However it does not offer [][] access, need to access element using ary[i*n+j]
int *ary3 = new int[size*size];
delete [] ary3;
【问题讨论】:
-
int *ary = new int[size]();不是编译器扩展,它是通过动态分配的一维可变长度数组。我很确定这是进行动态分配的最常见原因。 -
如果将指针包装在类中并使用重载运算符和代理类,则可以为最后一个版本提供
[][]访问权限。或者你只是重载operator()以获得ary3(x, y)语法。并摆脱new[]并使用std::vector。 -
为什么你认为向量解比较慢?它不应该做任何使其比原始动态分配数组慢的事情;如果有的话,对于某些操作,它应该会稍微快一点,并且更灵活,因为它使用新的放置,而不是
new[]。您可以使其与动态分配的数组完全相同(即此处的第三个解决方案)。 -
我正在复制我在下面所说的内容,但基本上我创建了一个大小为 100,000,000 的数组和向量,然后使用 container[i] = i 进行了 for 循环;向量时间为 0.269s,数组时间为 0.004s。
-
@JamesLens:这当然不应该发生。也许你离开边界检查?但即便如此,IMO 的差异也不应该那么大。您可以将您的确切测试用例作为单独的问题发布。
标签: c++ variables c++11 dynamic multidimensional-array