如何保存枚举类型的向量的向量
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]));
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 在 C++ 中输出枚举类类型的向量元素
- 目标C++不能在枚举块中使用向量push_back
- 访问向量字段的键 - 枚举类还是命名空间中的枚举?
- 错误:以增量方式填充向量时,表达式必须具有整数或无作用域枚举类型
- 如何保存枚举类型的向量的向量
- 我是否必须锁定我刚刚枚举的向量,或者我只在更改它时才这样做?
- 使用枚举作为索引访问 2D 向量
- 由枚举初始化的向量
- 如何使用枚举初始化向量/数组
- 表达式必须具有整数或无作用域枚举类型,并带有字符串向量
- 在枚举的向量中查找
- 如何在不知道 C++11 反射编程中元素类型的情况下枚举向量?
- 在c++中的向量中的结构中搜索枚举
- 如何在类之外返回枚举向量
- 枚举unique_ptr的向量时编译错误
- 使用枚举向向量添加的问题