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

Posted

技术标签:

【中文标题】如何将枚举类型向量的向量保存在【英文标题】:how to save vector of vector of type enum in 【发布时间】:2019-08-14 14:39:48 【问题描述】:

我有一个向量的向量,从文件加载后它代表我的地图,有一个问题,我该如何保存到它?比如坐标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::map&lt;std::pair&lt;int,int&gt;, FieldType&gt; my_map; 代替向量。然后它就变成了my_map.insert(x,y, Field::Sky); 有一个循环,使用push_back 将每一行组合成一个局部向量,然后在每行的末尾调用push_back 将该局部向量添加到my_map 向量中。 @PaulMcKenzie 你知道如何在构造函数中初始化地图吗?像这样? Logic() : board_width_(0), board_height_(0), map_(0,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]));  

【讨论】:

以上是关于如何将枚举类型向量的向量保存在的主要内容,如果未能解决你的问题,请参考以下文章

如何将mysql中枚举类型的数值在前台遍历为汉字

几何向量gcd+暴力枚举——cf552

如何在数据库室中保存枚举字段?

在java中如何将emun枚举类型作为参数传入函数中?

将一个枚举类型分配给另一个枚举类型

犰狳矩阵中的多种数据类型