使用size函数声明一个二维数组的C++语句

3
我正在尝试使用STL map的size()方法声明一个二维数组:
const int size = edge_map.size();//get row and column size

int a[size][size];//nxn matrix

我一直遇到编译器错误,即使我声明它为常量,大小也必须是一个常量值。是否有任何解决方法,而不必使用动态2D数组?


1
动态分配的数组必须使用new关键字进行定义。 - NiVeR
@NiVeR 我不是想动态声明它,我只是想使用 size 函数获取数字,并将该数字用作二维数组的维度。 - Daoud
2
“const int”和整数常量并不相同,尽管它们的名称很相似。 - Mark Ransom
@Daoud 如果数组的大小在编译时未定义,则它从定义上来说是动态的。你正在询问如何创建一个可以任意大小的数组,而不使用可以任意大小的数组类型。 - Lee Jenkins
你可以使用可调整大小的容器,例如std::vector,并将二维索引转换为一维索引;对于任何T[rN][cN],你可以创建一个有rN * cN个元素的vector<T> a(rN * cN),用(r * rN) + c作为索引来访问元素[r][c](例如,对于一个int[5][5]vector<int> a(25),对于元素[3][1],索引为16((3 * 5) + 1))。这只是动态一维数组的抽象,好处是你不需要自己进行内存管理。由于仍然是动态的,因此不能将其作为答案发布。 - Justin Time - Reinstate Monica
2个回答

3

对于数组的静态内存分配,只要变量的值可以在编译时确定,就可以接受变量。这个要求的原因是因为编译器必须知道在堆栈上为数组分配多少内存。如果 edge_map 是它听起来那样(某种可以在其存在期间更改大小的容器),您将无法以这种方式处理它。

但是,如果这不是情况,并且 edge_map.size() 有一个可以在编译时确定的返回值,将该函数标记为 constexpr 应该允许此代码正常工作。


你说得对,它确实会在程序运行过程中发生变化,但是有没有一种方法可以在程序的特定时间捕获其值,并将其用作二维数组的维度呢? - Daoud
@Daoud 是的... 通过使用new关键字。如果不使用new,编译器需要在编译时知道将需要多少内存。 - Daniel

1

const 意味着不改变它的原始(初始)值。

但是 size 必须在编译时知道,因为编译器/链接器为非局部变量(在任何函数之外声明的变量)分配内存。


我明白了,这是我的问题。你有什么推荐的方法吗? - Daoud
你必须在堆中分配它(而不是栈),即动态地,因此如果您事先不知道维度范围并坚持它必须在任何函数之外声明,则无法避免。 - MarianD
gcc有一个扩展,允许设置一个维度而不使用编译时常量。 - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接