我有一个向量的向量,从文件加载后它代表我的地图,这是一个问题,如何保存到其中?就像在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;
}
}
这使我的向量超出范围。有人可以帮我吗?
答案 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]));