多维数组作为要在堆上分配的类成员

时间:2019-06-05 13:23:02

标签: c++ arrays multidimensional-array heap-memory

我正在为我的学士学位论文编写模拟程序,但我不是C ++专家,并且在搜索了相当长的时间后,没有找到方便的答案或问题,因此我求助于你们。

我的问题如下。除了可以存储在堆栈中的其他成员字段外,我还有一些类具有几个成员字段num_anum_b。现在,这两个值的大小大约为1000-2000。我现在需要的是SampleClass的另一个类成员,即大小为num_a * num_b的二维布尔数组。由于其大小,需要在堆上分配它。它必须在内存中是连续的,因此对我来说,存储指向数组的指针的指针不起作用。

SampleClass : Object {
   public:
         uint16_t num_a;
         uint16_t num_b;
         ??? // some data structure for my 2d array

         // simple constructor
         SampleClass(num_a, num_b);

}

我在头文件.h中声明我的类,并在源文件.cc中实现函数和构造函数。

如您所见,num_anum_b的值不是预先确定的,因此不是const。我的问题是,如何(以一种简单的方式)在头文件中声明此内容,以及如何在源文件的构造函数中对其进行初始化?

我发现使用vector的东西如下:

// header file
std::vector<std::vector<bool>> *coverage_matrix;

// source file
coverage_matrix = new std::vector<std::vector<bool>>();
coverage_matrix->push_back(something); // do something with it

最后一种方法是否有效,更重要的是,它是否像不依赖std::vector的解决方案一样有效?

感谢您的回答。

1 个答案:

答案 0 :(得分:3)

  大小为num_a * num_b

二维数组...由于其大小,需要在堆上分配它。它必须在内存中是连续的

std::vector<std::vector<bool>>

在向量的向量中,行在其内部是连续的,但彼此之间并不相关。这与指针数组相同。因此,这不能满足您对连续布局的需求。

 new std::vector<std::vector<bool>>()

几乎不需要像这样动态分配向量。最好避免使用,以确保正确性和性能。


分配动态大小的连续数组的唯一解决方案是分配一维数组,其中各行之间是平坦的。例如:

std::vector<bool> matrix(num_a * num_b);

您可以在索引a + num_a * b处访问元素[a] [b]。


请注意,std::vector<bool>非常特殊,与其他向量不同。它不包含任何bool对象,而是打包了这些位,并通过屏蔽和移位 1 进行访问。这使得数据结构非常易于缓存,但是操作更加复杂。这对性能的好坏取决于您对它的处理方式以及CPU结构。

比性能考虑更重要的是,这意味着您可以依赖于其他数组的某些保证不适用于std::vector<bool>。例如,您不能获取元素的地址,也不能在不同步的情况下修改不同线程中的不同元素。而且对于您的特殊情况,由于不能保证布尔对象,因此肯定不能保证向量中存在连续的布尔对象。

因此,如果您需要bool的常规数组,则在使用向量时需要解决专业化问题。例如:

enum boolean : bool {no, yes};
std::vector<boolean> matrix;

1 从技术上讲,不能保证任何特定的表示形式。它是实现定义的。

相关问题