Ede*_*dex 2 c++ multidimensional-array
所以我想创造一个方形世界的游戏。
开始游戏时,用户应该能够指定世界的大小。
世界被保存为短裤的二维数组。
const short gameSize = 4;
short world[gameSize][gameSize];
Run Code Online (Sandbox Code Playgroud)
在short gameSize必须const的,否则,我不能忍受gameSize的大小world[][]。
但是,这不允许我设置gameSize为玩家希望的大小。
我想到了一些简单的东西
short gameSize = 0;
cout << "World size?" << endl;
cin >> gameSize;
short world[gameSize][gameSize];
Run Code Online (Sandbox Code Playgroud)
如前所述,这行不通。
在游戏中,以后将无法更改 gameSize 的值。
我怎么能做到这一点?
new链接的问题/答案会引导您这样做。在您的情况下这是不必要的,并且会无缘无故地增加潜在错误的风险。std::vector<short>来管理内存的可转位块存储世界价值观。#include <vector>
#include <cassert>
#include <iostream>
class GameWorld {
std::size_t world_size_;
std::vector<short> data_;
public:
GameWorld(std::size_t size)
: world_size_(size)
, data_(size * size) {}
short& operator()(std::size_t x, std::size_t y) {
assert(x < world_size_ && y < world_size_);
return _data[y + x * world_size_];
}
const short& operator()(std::size_t x, std::size_t y) const {
assert(x < world_size_ && y < world_size_);
return _data[y + x * world_size_];
}
};
int main() {
short gameSize = 0;
std::cout << "World size?" << std::endl;
std::cin >> gameSize;
GameWorld world(gameSize);
// Set the value of [0, 0] to 4
world(0, 0) = 4;
}
Run Code Online (Sandbox Code Playgroud)
这里发生了一些事情:
vector<short>将为您提供动态大小以及内存安全性。即事情将根据需要“自动”清理。vector<vector<short>>,以便world[x][y]“正常工作”。但这并不是很好,因为内存将无处不在,将其紧密地打包到一维数组中通常会给您带来一系列性能优势。world[x][y]在之前的代码中调用时编译器所做的完全相同,因此这里不会产生额外的成本。assert()在调试模式下构建时,s 将捕获潜在的错误,并在发布/NDEBUG 模式下完全消失。所以你有一个额外的“免费”安全网。奖励:如果您想开始涉足模板编程,这是一个很好的学习起点。模板GameWorld,以便它可以是一个世界float,int或者一些struct Cell不是始终是一个世界short是有用的,容易做到的,而不是破坏性的代码的其余部分。
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |