如何将枚举类型向量的向量保存在
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<std::pair<int,int>, FieldType> 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]));
【讨论】:
以上是关于如何将枚举类型向量的向量保存在的主要内容,如果未能解决你的问题,请参考以下文章