C++上二维数组的大小
Posted
技术标签:
【中文标题】C++上二维数组的大小【英文标题】:Size of 2D array on C++ 【发布时间】:2020-06-10 00:32:40 【问题描述】:我已经使用以下方式声明了一个二维数组
for(int i = 0; i < rowCount; ++i)//rowCount = 5
a[i] = new int[colCount]; //colCount = 6
我想检查这个数组的大小,我知道我可以看看我在声明数组时放入的数字,但我想看看代码是否按照我的预期工作。
我使用“sizeof(a)/sizeof(a[0])”来获取行数,但它没有给出预期的数字
【问题讨论】:
这能回答你的问题吗? Finding size of dynamically allocated array 您应该避免使用new
。无法获得分配的大小是其原因之一。请改用std::vector
。
这不是二维数组 - 这是一维数组的指针指向一维数组。二维数组将被定义为int a[N][M];
。
还有How do I find the length of an array?。特别是不要使用sizeof(a)/sizeof(a[0])
来获取数组的长度。正如您在此处所观察到的,如果您犯了错误,它很容易给出错误的结果。 This answer 有更好的方法,从 C++17 开始,您可以使用 std::size(a)
。
抱歉,我误读了您的部分问题。请澄清a
是如何声明的。提供minimal reproducible example。我要离开我的 cmets,因为它们可能仍然适用。
【参考方案1】:
您可以按照建议使用std::vector<std::vector>>
并采用他们的.size()
方法,但这不是最适合内存的。
我建议将您的数组数组(也就是指针的指针)包装在一个小的专用类中,该类在内部跟踪大小,允许您访问原始数据并且还具有getWidth
和getHeight
函数。您还可以轻松地为其提供方便的功能,例如.setAll(T value)
,并使用模板来支持任何数据类型。
// Example program
#include <iostream>
#include <string>
template<class T>
class RawGrid
private:
int width, height;
public:
RawGrid(int width, int height) : width(width), height(height)
data = new T*[width];
for(int i = 0; i < width; i++)
data[i] = new T[height];
~RawGrid()
if (data)
for(int i = 0; i < width; i++)
delete[] data[i];
delete[] data;
int getWidth()
return(width);
int getHeight()
return(height);
T** data = nullptr;
;
int main()
RawGrid<int> grid(100, 50);
grid.data[10][25] = 20;
std::cout << "Data value: " << grid.data[10][25] << "!\n";
std::cout << "Width: " << grid.getWidth() << "!\n";
std::cout << "Height " << grid.getHeight() << "!\n";
【讨论】:
你介意给我举个例子说明这是怎么做的吗? 你说 std::vectoris not the most memory friendly
的原因是什么?
@theWiseBro 每个向量实例都需要一些额外的簿记内存,这不仅仅是一个指针。诚然,实践中的差异可能很小。
@AlexGeorg 我看不出您的实现如何比向量更友好。 Afaik,除了原始指针之外,vector 只保留 capacity
,size
和 allocator
其对象的一部分。而且我非常相信使用 stl 容器总是更易于维护,并且在大多数情况下,比自定义代码更节省性能内存。但是,是的,如果 OP 的兴趣领域像他所说的那样固定为仅在小情况下使用 2D 数组,那么是的,您的解决方案也相当不错。
@AlexGeorg 您的示例违反了三规则,并且不是异常安全的。您的解决方案与std::vector<std::vector<int>>
存在相同的问题:它分配多次(每次分配器在时间和内存方面的开销)。 std::vector
的额外开销仅在于大小/容量值,这与分配无关。【参考方案2】:
问题是a
并没有真正持有二维数组。您应该将其视为a
是一个数组数组。因此a
的大小仅为 5,而a
中的每个数组的大小为 6(请记住,a
中的每个数组的大小都没有限制)。如果您真的想计算总大小,您应该遍历 a
并对所有行的大小求和。
【讨论】:
他们只想要行数:“获取行数” 如果a
是一个指针(可能),这仍然行不通。跨度>
以上是关于C++上二维数组的大小的主要内容,如果未能解决你的问题,请参考以下文章