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