使用字符串**创建地图。我想我的方向错了

时间:2014-04-02 10:15:14

标签: c++ string

我来找你,因为我是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];
  }

但是,当然,当我试图填满地图时,它无法正常工作。

有人可以帮助我或引导我做些什么吗?

提前谢谢你:)

3 个答案:

答案 0 :(得分:1)

这样做:

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

请参阅vectorstring

在旁注中,在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) = '*';