我用C ++创建了一个2D数组:
Board::Board(int rows, int cols){
places = new int*[rows];
for (int row = 0; row < rows; row++){
places[row] = new int[cols];
for (int col = 0; col < cols; col++){
places[row][col] = 0;
}
}
}
这很有效。 但是现在我想创建一个需要数组行和列长度的函数。我尝试了一下这个功能:
sizeof()
但我只是使用普通数组来返回长度。
如何在不声明行和列的全局变量的情况下执行此操作?
答案 0 :(得分:1)
首先,在性能方面明确地分配2D数组并不是一个好主意,因为内存不是连续的。最好将它分配到一块内存中(除非它太大),并像大多数图像处理库那样抽象2D访问(例如OpenCV)。
那就是说,你应该将它包装在一个知道分配大小的类中,然后用公共方法报告大小。
答案 1 :(得分:0)
看起来你有一个“Board”对象,所以将“place”及其大小信息存储到该类/ struct
并创建一个返回std :: pair的sizeof()函数,如:
std::pair<unsigned int, unsigned int> sizeof(const Board& b)
{ return make_pair(b.row(), b.col());}
答案 2 :(得分:0)
以这种方式创建2D数组后,places
实际上是一个指向其内容第一行的指针。
指针不存储任何元数据以指示它们指向的区域的大小;如果只有指针,那么就没有(可移植的)方法来检索数组中的行数或列数。
您将需要将该信息与指针一起传递,或者您需要在数组本身中使用sentinel值(类似于C字符串如何使用0终止符,尽管这只会为您提供逻辑字符串的大小,可能小于它占用的数组的物理大小。
查看How to get size of 2D array pointed by a double pointer?了解详情。
修改:我建议您使用vector<vector<int>>
,因为您使用的是C ++。
答案 3 :(得分:0)
以下可能会有所帮助:
class Board
{
public:
Board(int rows, int cols) : rowCount(rows), columnCount(cols) {
places = new int*[rows];
for (int row = 0; row < rows; row++){
places[row] = new int[cols];
for (int col = 0; col < cols; col++){
places[row][col] = 0;
}
}
}
private:
int** places;
int rowCount;
int columnCount;
};
存储大小的信息就是实例本身。