在简单的一维数组中:
node *nodes = new node[MAX_NODES];
Run Code Online (Sandbox Code Playgroud)
删除:
delete [] nodes;
Run Code Online (Sandbox Code Playgroud)
删除数组中分配的所有节点.
但在这种情况下:
float (*buildingArray)[3] = new float[10][3];
Run Code Online (Sandbox Code Playgroud)
这个语句是否buildingArray包含3个浮点指针的单维数组?这是解除分配线:
delete[] buildingArray;
Run Code Online (Sandbox Code Playgroud)
以上是否释放delete了数组,但我怀疑它是否会删除它的引用?
以下是使用C++实现哈希表.你能帮我理解一下HashEntry **table是什么吗?为什么它被声明为双指针?它是一个数组,数组的每个值是HashEntry?
class HashEntry {
private:
int key;
int value;
public:
HashEntry(int key, int value) {
this->key = key;
this->value = value;
}
int getKey() {
return key;
}
int getValue() {
return value;
}
};
const int TABLE_SIZE = 128;
class HashMap {
private:
HashEntry **table;
public:
HashMap() {
table = new HashEntry*[TABLE_SIZE];
for (int i = 0; i < TABLE_SIZE; i++)
table[i] = NULL;
}
int get(int key) {
int hash = (key % …Run Code Online (Sandbox Code Playgroud) 如何使用'new'运算符声明二维数组?我的书说:
int (*p)[4];
p=new[3][4];
Run Code Online (Sandbox Code Playgroud)
但这对我没有意义.p是一个指向4个整数数组的指针,那怎么能指向一个二维数组呢?
所以我想将2D数组的内容复制到完全相同类型的另一个数组.以下是创建数组的方式:
GridUnit** newGrid;
newGrid = new GridUnit*[width];
for (int i = 0; i < width; i++)
newGrid[i] = new GridUnit[height];
Run Code Online (Sandbox Code Playgroud)
GridUnit的大小为16(4个浮点数).因此,所有初始化都没有问题,因为在运行for循环实际用一些数据填充值之后使用它没有问题.现在我要做的是将另一个数组的内容复制到这个数组中(如果可能,不使用for循环).这是我到目前为止一直在尝试做的事情:
memcpy(&newGrid, &grid, height * width * 16);
Run Code Online (Sandbox Code Playgroud)
'grid'在大小和类型方面与'newGrid'相同.但是,这不起作用.我知道memcpy可能不正确,但是尝试了多种不同的设置,我不知道它出了什么问题,所以任何帮助都会受到欢迎!
我正在进行一项任务,我转换矩阵以减少矩阵乘法运算的缓存未命中.根据我对几个同学的理解,我应该得到8倍的提升.但是,我只得到2倍......我可能做错了什么?
void transpose(int size, matrix m) {
int i, j;
for (i = 0; i < size; i++)
for (j = 0; j < size; j++)
std::swap(m.element[i][j], m.element[j][i]);
}
void mm(matrix a, matrix b, matrix result) {
int i, j, k;
int size = a.size;
long long before, after;
before = wall_clock_time();
// Do the multiplication
transpose(size, b); // transpose the matrix to reduce cache miss
for (i = 0; i < size; i++)
for (j = 0; j …Run Code Online (Sandbox Code Playgroud) 我们在学校教的是这样的:
int x;
cin >> x;
int array[x];
Run Code Online (Sandbox Code Playgroud)
要么
int x, y;
cin >> x >> y;
int array[x][y];
Run Code Online (Sandbox Code Playgroud)
但是,我知道它在C++中是无效的代码.但即使它是,它仍然可以完成工作并且按预期工作,但是,我想找到它如何正确完成的答案?
根据typeid(array).name()它是PAN_i在G ++ 4.8.4.我知道P意味着指针和i意味着int,但是什么类型是什么A,为什么只有第二个维度N- 而不是第一个 - M.
我应该输入什么而不是自动输入auto array = new int[M][N]?
是否有分配的方式array来int**?
另一个问题是M和N必须是编译时常量.如果他们不是,我想我唯一的选择是动态C++ 03 2D阵列.
每次我为2D数组分配内存时,我首先创建一个数组,int**然后使用for我为每个元素分配内存.
例如:
int ** arr = malloc(N*sizeof(int *));
for(i=0; i< N; i++) arr[i] = malloc(M*sizeof(int));
Run Code Online (Sandbox Code Playgroud)
不可能像以下那样分配内存:
int ** arr = malloc(N*sizeof(int[M]));
Run Code Online (Sandbox Code Playgroud)
要么
int ** arr = malloc(sizeof(int[N][M]));
Run Code Online (Sandbox Code Playgroud)
为了避免for?
我想从磁盘(HDF5)加载N维矩阵到std::vector对象.
我事先知道他们的等级,而不是形状.例如,其中一个矩阵是4级std::vector<std::vector<std::vector<std::vector<float>>>> data;
我想使用向量来存储值,因为它们是标准的而不像c-arrays那样难看(主要是因为它们知道它们的长度).
但是,加载它们的方法是使用一个加载函数void *,该函数采用a ,这对于1级向量可以正常工作,我可以调整它们然后访问它的数据指针(vector.data()).对于更高级别,vector.data()只会指向vectors,而不是实际数据.
最糟糕的情况我只是将所有数据加载到辅助c数组然后手动复制,但这可能会使大矩阵的速度降低很多.
有没有办法在向量中包含连续的多维数据,然后获得单个地址?
考虑以下使用动态分配的二维数组的方式(由于某种原因,这里的回复中没有出现这种方式):
const int nRows = 2, nCols = 3;
int (*arr)[nCols] = (int(*)[nCols])(new int[nRows * nCols]);
arr[1][1] = 2;
std::cout << arr[1][1] << endl;
delete[] arr;
Run Code Online (Sandbox Code Playgroud)
delete[]在这种情况下,最后一行是否正确释放了内存?