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

时间:2019-03-23 23:47:46

标签: c++

我有一个向量的向量,从文件加载后它代表我的地图,这是一个问题,如何保存到其中?就像在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;
   }

}

这使我的向量超出范围。有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

出什么问题了?

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

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]));