c++ - 多维数组作为类成员在堆上分配
问题描述
我正在为我的学士论文编写一个模拟程序,而且我不是 C++ 方面的专家,在搜索了很长一段时间后没有找到方便的答案或问题,就此而言,我求助于你们。
我的问题如下。我有一些类有几个成员字段num_a
,num_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_a
和num_b
不是预先确定的,因此不是const
. 我的问题是,我如何(以一种简单的方式)在头文件中声明这个东西,以及如何在源文件的构造函数中初始化它?
我发现使用向量的一件事如下:
// 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
?
感谢您的回答。
解决方案
二维...数组...大小
num_a * num_b
...由于它的大小,它需要在堆上分配。它需要在内存中是连续的std::vector<std::vector<bool>>
在向量的向量中,行在自身内部是连续的,但彼此之间不相关。这与指针数组相同。因此,这不能满足您对连续布局的需求。
new std::vector<std::vector<bool>>()
几乎不需要像这样动态分配向量。为了正确性和性能,最好避免使用。
分配动态大小的连续数组的唯一解决方案是分配一维数组,其中的行一个接一个。像这样的例子:
std::vector<bool> matrix(num_a * num_b);
您可以访问 index 处的元素 [a][b] a + num_a * b
。
请注意,这std::vector<bool>
是非常特殊的,与其他向量不同。它不包含任何bool
对象,而是将位打包,并通过掩码和移位1访问。这使得数据结构对缓存非常友好,但操作更加复杂。这对性能是好是坏取决于你用它做什么以及 CPU 架构。
比性能考虑更重要的是,这意味着您可以依赖于其他数组的某些保证不适用于std::vector<bool>
. 例如,你不能获取一个元素的地址,也不能在不同步的情况下修改不同线程中的不同元素。对于您的特殊情况,因为不能保证 bool 对象,所以肯定不能保证向量中是连续的 bool 对象。
因此,如果您需要一个 的常规数组,则bool
需要在使用向量时解决专门化问题。例如:
enum boolean : bool {no, yes};
std::vector<boolean> matrix;
1从技术上讲,不保证任何特定的陈述。它是实现定义的。
推荐阅读
- r - ggplot2:移动(重新定位)图例以免阻塞图形框
- c# - Azure 函数中的 OutOfMemoryException
- mysql - Laravel Eloquent:计算两个表中的数据
- c# - Calculator project c#
- sql-server - 从具有相同字段名称的3个表中获取结果
- python-3.x - 如何使用 pandas to_excel 方法读取 excel,直到特定列?
- python - 尝试将 dtype 对象转换为浮点数时,pandas 数据框中出现错误
- wordpress - 修改古腾堡区块的上传目录
- python - 记录器打印错误:格式字符串的参数不足
- python - Python 按日期从 SQL 表中选择