我有一个矢量的矢量,它表示从文件加载后我的地图,有一个问题,我如何保存到它?就像在x和y坐标上一样,是这种类型吗?
//Field.cpp
enum Fieldtype <River,Building,Earth,Sky...>
//Logic.cpp
std::vector<std::vector<Field::Fieldtype>> my_map;
char array[10][10];将我的map从txt文件加载到char数组后,现在的问题是如何将其保存到map中?
要查看此贴图:
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;
}
}这会让我的向量超出范围。有人能帮帮我吗?
发布于 2019-03-24 07:59:21
有什么问题?
问题是,当您使用以下命令创建向量时:
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])); https://stackoverflow.com/questions/55319447
复制相似问题