如何检查数组索引是否为空?C++ OpenGL课程项目优化咨询
1. 如何检查数组中的某个索引位置是否为空?
嘿,这个得分情况来看,毕竟不同类型的数组,“为空”的判断逻辑不一样:
如果是指针数组(就像你后面用到的
Cube* cubes[CUBE_AMOUNT]这种):
首先建议你初始化数组的时候把所有元素设为nullptr,这样后续检查就很简单——直接判断目标索引的元素是不是等于nullptr就行。代码示例:// 初始化整个数组为空指针 Cube* cubes[CUBE_AMOUNT] = {nullptr}; // 检查索引i的位置是否为空 if (cubes[i] == nullptr) { // 这儿是空的,可以填充啦 }如果是值类型数组(比如
int、float这种基本类型的数组):
C++里值类型本身没有“空值”的概念,所以得自己定一个「标记值」来代表空。比如如果是存正整数的数组,就可以用-1当空标记,前提是这个值不会出现在你的正常数据里。示例:int scoreArr[10] = {-1}; // 用-1标记空位置 if (scoreArr[3] == -1) { // 这个位置是空的 }如果用标准库容器(比如
std::vector):
可以用std::optional来包装元素,这样直接调用has_value()就能判断是否为空;如果是指针容器,同样判断是否为nullptr就行:std::vector<std::optional<Cube>> cubeVec(CUBE_AMOUNT); if (!cubeVec[2].has_value()) { // 该位置是空的 }
2. C++ OpenGL Cube数组的填充&特色优化建议
先看你的场景,你已经声明了Cube* cubes[CUBE_AMOUNT],首先第一步一定要先初始化数组为nullptr,不然默认的野指针会搞出一堆奇怪的bug!
// 把数组所有元素初始化为空指针 Cube* cubes[CUBE_AMOUNT] = {nullptr};
基础填充方法
循环创建立方体就行,比如按网格排列放置多个立方体:
// 假设你已经加载好了Mesh和纹理(这部分你应该已经实现了) Mesh* cubeMesh = loadMyCubeMesh(); // 你的Mesh加载函数 Texture2D* cubeTex = loadTexture("assets/cube_diffuse.png"); // 加载纹理 for (int i = 0; i < CUBE_AMOUNT; ++i) { // 让立方体按5xN的网格排列,每个间隔2单位 float x = (i % 5) * 2.0f; float y = 0.0f; // 可以改成随机值让布局更有趣 float z = (i / 5) * 2.0f; // 创建Cube实例并放到数组里 cubes[i] = new Cube(cubeMesh, cubeTex, x, y, z); }
让你的程序更有特色的小点子
既然是入门课的作业,加点小细节就能脱颖而出:
随机化立方体属性:给每个立方体不同的旋转速度、初始位置,甚至随机选纹理(如果你有多个纹理的话):
#include <cstdlib> // 用来生成随机数 for (int i = 0; i < CUBE_AMOUNT; ++i) { float x = (i % 5) * 2.0f; float y = static_cast<float>(rand() % 10) / 2.0f; // Y位置随机0-5 float z = (i / 5) * 2.0f; cubes[i] = new Cube(cubeMesh, cubeTex, x, y, z); // 自定义旋转速度(1-6之间随机) cubes[i]->rotationSpeed = static_cast<float>(rand() % 5) + 1.0f; // 随机旋转轴方向 cubes[i]->rotationVector = Vector3( static_cast<float>(rand() % 100) / 100.0f, static_cast<float>(rand() % 100) / 100.0f, static_cast<float>(rand() % 100) / 100.0f ); }添加简单交互:比如按空格键在空位置生成新立方体,或者用方向键控制某个立方体移动:
// 假设按下空格键时,找第一个空位置生成立方体 if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { for (int i = 0; i < CUBE_AMOUNT; ++i) { if (cubes[i] == nullptr) { // 生成在屏幕中心位置 cubes[i] = new Cube(cubeMesh, cubeTex, 0.0f, 0.0f, 0.0f); break; // 找到第一个空位就停 } } }别忘了内存清理:程序结束时一定要释放所有Cube实例,不然会有内存泄漏:
for (int i = 0; i < CUBE_AMOUNT; ++i) { if (cubes[i] != nullptr) { delete cubes[i]; cubes[i] = nullptr; } } // 如果Mesh和Texture是动态分配的,也要记得释放 delete cubeMesh; delete cubeTex;
内容的提问来源于stack exchange,提问作者John Yuki
相关产品推荐
相关产品推荐

