如何保存枚举类型向量的向量

how to save vector of vector of type enum in

我有一个向量的向量,它代表我从文件加载后的地图,有问题,我该如何保存到它?就像在坐标 x 和 y 处是这种类型 ?

//Field.cpp
enum Fieldtype <River,Building,Earth,Sky...>

//Logic.cpp
std::vector<std::vector<Field::Fieldtype>> my_map;
char array[10][10];

将我的地图从 txt 文件加载到 char 数组后,现在的问题是如何将其保存到地图中?

例如这张地图:

SSSSS
SSSSS
BBBBB
EEEEE

S 是我的天空,B 是建筑...我试过

for(int x = 0; x < 6; x++)
{
   for(int y= 0; y< 6; y++)
   {
      if(array[x][y] == 'S')
         my_map.at(x).at(y) = Field::Sky;
   }

}

这让我得到一个超出范围的向量。有人可以帮我吗?

有什么问题吗?

问题是当您使用以下方法创建矢量时:

std::vector<std::vector<Field::Fieldtype>> my_map;

当您尝试加载此向量时,它完全是空的。所以任何访问元素的尝试,即使是 my_map[0][0],都将超出范围!

如何解决?

您应该使用 resize()push_back() 或两者的组合来填充向量,例如:

my_map.resize(6);     // takes care of all the x at once 
for(int x = 0; x < 6; x++)
{
   for(int y= 0; y< 6; y++)
   {
      if(array[x][y] == 'S')
         my_map[x].push_back(Field::Sky);   // add the y one by one 
      ...
   }
}

进一步改进

为了避免大量 if 子句来处理不同的字母,您还可以创建一个映射:

map<char, Field::Fieldtype> mapfield; 

您将使用以下内容填充您的地图:

mapfield['S'] = Field::Fieldtype::Sky;
...

然后你可以重写你的循环:

my_map.resize(5);     // takes care of all the x at once 
for(int x = 0; x < 6; x++)
   for(int y= 0; y< 6; y++)
      my_map[x].push_back(mapfield[array[x][y]]);  

一个更简单但更脏的替代方法是定义:

enum Fieldtype:char {River='R',Building='B',Earth='E',Sky='S', ...};

并在循环中用以下内容填充字段:

my_map[x].push_back(static_cast<Fieldtype>(array[x][y]));