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&lt;std::vector&gt;&gt; 并采用他们的.size() 方法,但这不是最适合内存的。 我建议将您的数组数组(也就是指针的指针)包装在一个小的专用类中,该类在内部跟踪大小,允许您访问原始数据并且还具有getWidthgetHeight 函数。您还可以轻松地为其提供方便的功能,例如.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::vector is not the most memory friendly 的原因是什么? @theWiseBro 每个向量实例都需要一些额外的簿记内存,这不仅仅是一个指针。诚然,实践中的差异可能很小。 @AlexGeorg 我看不出您的实现如何比向量更友好。 Afaik,除了原始指针之外,vector 只保留 capacity,sizeallocator 其对象的一部分。而且我非常相信使用 stl 容器总是更易于维护,并且在大多数情况下,比自定义代码更节省性能内存。但是,是的,如果 OP 的兴趣领域像他所说的那样固定为仅在小情况下使用 2D 数组,那么是的,您的解决方案也相当不错。 @AlexGeorg 您的示例违反了三规则,并且不是异常安全的。您的解决方案与std::vector&lt;std::vector&lt;int&gt;&gt; 存在相同的问题:它分配多次(每次分配器在时间和内存方面的开销)。 std::vector 的额外开销仅在于大小/容量值,这与分配无关。【参考方案2】:

问题是a 并没有真正持有二维数组。您应该将其视为a 是一个数组数组。因此a 的大小仅为 5,而a 中的每个数组的大小为 6(请记住,a 中的每个数组的大小都没有限制)。如果您真的想计算总大小,您应该遍历 a 并对所有行的大小求和。

【讨论】:

他们只想要行数:“获取行数” 如果a 是一个指针(可能),这仍然行不通。跨度>

以上是关于C++上二维数组的大小的主要内容,如果未能解决你的问题,请参考以下文章

c++二维数组和二级指针

C++中二维数组传参的方法详解

如何在 C++ 中分配一个二维指针数组

在 MPI C++ 中传递大型二维数组

C++ 数组(及二维数组)与指针(互转遍历),数组与引用

在 C++ 中表示二维数组的最佳方法,其大小在运行时确定