使用字符串**创建地图。我想我走错了路

Map creation with string**. I guess I'm on the wrong way

本文关键字:错了路 地图 字符串 创建      更新时间:2023-10-16

我来找你是因为我是C++初学者,用C编程,当我必须创建地图时,我有点迷茫。

事实上,当我想从程序参数创建映射时,我习惯于操作 char**。这就是我想要创建的地图类型:

*******
*     *
*     *
*******

如果是在 C 中,我会这样做:字符**地图;

map = malloc(sizeof(char*) * sizeY);
while (i < sizeY)
{
  map[i] = malloc(sizeof(char**) * sizeX);
  ++i;
} 

但是,我在 c++ 中,我正在尝试使用字符串。这就是问题所在,我不能像字符**那样操纵它。

我唯一能编译的是:

  _map = new std::string*;
  for (int i = 0; i < sizeY; ++i)
  {
    _map[i] = new std::string[sizeY * sizeX];
  }

但是,当然,当我尝试完整地图时,这无法正常工作。

有人可以帮助我或引导我做某事吗?

提前谢谢你:)

在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;

当您了解异常安全的概念时,您将了解为什么这是一个坏主意;您应该始终使用 RAII 类(如 std::vector)来管理动态资源。

这样做:

vector <string> map;    
cin>>size;    
map.resize(size);

请参阅矢量和字符串。

附带说明一下,在 C 中它将是

map[i] = malloc(sizeof(char) * sizeX);

map[i] = malloc(sizeof(char**) * sizeX);

我不建议使用交错数组。而是使用例如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) = '*';