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

how to save vector of vector of type enum in

本文关键字:向量 枚举 类型 保存 何保存      更新时间:2023-10-16

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