我来找你,因为我是C ++的初学者,用C语言编程,当我必须创建地图时,我有点迷失。
事实上,当我想从程序参数创建一个地图时,我习惯操纵char **。 这就是我想创造的那种地图:
*******
* *
* *
*******
如果它在C中,我会做到: char ** map;
map = malloc(sizeof(char*) * sizeY);
while (i < sizeY)
{
map[i] = malloc(sizeof(char**) * sizeX);
++i;
}
但是,我在使用c ++而我正在尝试使用字符串。 这就是问题所在,我无法以与char **相同的方式操纵它。
我唯一可以编译的是:
_map = new std::string*;
for (int i = 0; i < sizeY; ++i)
{
_map[i] = new std::string[sizeY * sizeX];
}
但是,当然,当我试图填满地图时,它无法正常工作。
有人可以帮助我或引导我做些什么吗?
提前谢谢你:)
答案 0 :(得分:1)
这样做:
vector <string> map;
cin>>size;
map.resize(size);
在旁注中,在C中它将是
map[i] = malloc(sizeof(char) * sizeX);
不
map[i] = malloc(sizeof(char**) * sizeX);
答案 1 :(得分:1)
在C ++中,标准库提供了为我们管理动态数组的类:
#include <vector>
#include <string>
std::vector<std::string> map(sizeY, std::string(sizeX, ' '));
如果你想要一个杂耍指针的练习,那么你想要更像的东西
std::string * map = new std::string[sizeY];
for (int i = 0; i < sizeY; ++i) {
map[i].resize(sizeX);
}
// don't forget to delete it when you've finished
delete [] map;
当您了解异常安全的概念时,您将理解为什么这是一个坏主意;您应始终使用std::vector
等{{1}}类来管理动态资源。
答案 2 :(得分:0)
我不建议使用锯齿状阵列。而是使用例如std::vector
将地图存储在连续内存中。您可以编写一个类来将所有与地图相关的代码保存在一个位置。
class Map
{
Map(int rows, int cols)
: rows_(rows), cols_(cols), cells_(rows*cols,' ') {}
char& operator()(int r, int c) {
return cells_[index(r,c)];
}
size_t index(int r, int c) const {
return r*cols_ + c;
}
private:
int rows_, cols_;
vector<char> cells_;
};
用法:
Map map(4,7);
map(0,0) = '*';