gpt4 book ai didi

c++ - 在c++中初始化一些数据数组

转载 作者:太空狗 更新时间:2023-10-29 20:04:47 25 4
gpt4 key购买 nike

我想设置所有俄罗斯方 block 的定义:

#include <iostream>
#include <vector>

struct Tetris{
std::vector<int> data;
int getAt(int x, int y){return data.at(y*4+x);};
} tetris[6];

int main(){
//stick
tetris[0].data.resize(32);
int array0[32]={0,0,0,0,
0,0,0,0,
1,1,1,1,
0,0,0,0,
0,1,0,0,
0,1,0,0,
0,1,0,0,
0,1,0,0};
tetris[0].data.assign(array0,array0+32);

//brick
tetris[1].data.resize(16);
int array1[16]={0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0};
tetris[1].data.assign(array1,array1+16);

...

}

这样我就需要定义6个数组来存放初始化数据(array0, array1...),初始化后就没用了。这看起来效率很低并且浪费内存。我想知道是否有办法在每次使用后删除这些数据?

更新:

如果我想重用array0,比如

    tetris[0].data.resize(32);
int array0[32]={...};
tetris[0].data.assign(array0,array0+32);

//brick
tetris[1].data.resize(16);
delete array0;
int array0[16]={...};
tetris[1].data.assign(array0,array0+16);

...

编译器会报错“array0 redefinition”。 delete 在这种情况下不起作用吗?

最佳答案

如果您想控制静态分配类型的生命周期,您可以添加任意范围解析运算符来实现。

int main()
{
{
//stick
tetris[0].data.resize(16);
int array0[16]={0,0,0,0,
0,0,0,0,
1,1,1,1,
0,0,0,0};
tetris[0].data.assign(array0,array0+16);

//brick
tetris[1].data.resize(16);
int array1[16]={0,0,0,0,
0,1,1,0,
0,1,1,0,
0,0,0,0};
tetris[1].data.assign(array1,array1+16);
}//THISONE
//Do the rest of the work of main, without the pesky arrays sticking around.

}

在这个例子中,你的 tetris 变量仍然存在,因为它是全局的。但是您声明的那些数组不会停留在“THISONE”之后。

请注意,我不一定推荐这种方法。创建一个类,或使用其他一些更标准的方法是更可取的。但有时这是一个不错的小技巧,可以避免使用不必要的动态分配。

编辑:这种方法可能更好,但请确保您了解正在发生的一切,否则最好坚持使用您所知道的。特别是如果你不理解我在这里做的所有坏事,为了快速给你举个例子。

#include <iostream>
using namespace std;

class stick;//Forward declaration so shape can make stick a "friend"

class shape {//This classe declaration should go in a .h file.
static const int WIDTH = 4;
static const int HEIGHT = 4;
int array[WIDTH][HEIGHT];

public:


shape(){
for(int i = 0; i < HEIGHT; i++) {
for(int j = 0; j < WIDTH; j++) {
array[i][j] = 0;
}
array[i][i] = 1;
}
}

void printShape() {
for(int i = 0; i < HEIGHT; i++) {
for(int j = 0; j < WIDTH; j++) {
cout << array[i][j] << " ";
}
cout << endl;
}
}

friend class stick;
};

class stick: public shape {//This declaration should also go in a header file
public:
stick() {
for(int i = 0; i < HEIGHT; i++) {
for(int j = 0; j < WIDTH; j++) {
if(i == 0) array[i][j] = 1;
else array[i][j] = 0;
}
}
}
};



int main(){

shape planeShape;
stick stickShape;
cout << "PLAIN SHAPE: " << endl;
planeShape.printShape();

cout << endl << "STICK SHAPE: " << endl;
stickShape.printShape();



cout << endl << "PLANE SHAPE POINTER:" << endl;
shape* shapePointer = &planeShape;
shapePointer->printShape();

cout << endl << "STICK SHAPE POINTER:" << endl;
shapePointer = &stickShape;
shapePointer->printShape();

}

关于c++ - 在c++中初始化一些数据数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16969951/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com