首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何保存枚举类型向量的向量

如何保存枚举类型向量的向量
EN

Stack Overflow用户
提问于 2019-03-24 07:47:46
回答 1查看 93关注 0票数 1

我有一个矢量的矢量,它表示从文件加载后我的地图,有一个问题,我如何保存到它?就像在x和y坐标上一样,是这种类型吗?

代码语言:javascript
复制
//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中?

要查看此贴图:

代码语言:javascript
复制
SSSSS
SSSSS
BBBBB
EEEEE

其中S是我的天空,B是建筑...我试着用

代码语言:javascript
复制
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;
   }

}

这会让我的向量超出范围。有人能帮帮我吗?

EN

回答 1

Stack Overflow用户

发布于 2019-03-24 07:59:21

有什么问题?

问题是,当您使用以下命令创建向量时:

代码语言:javascript
复制
std::vector<std::vector<Field::Fieldtype>> my_map;

当你试图加载它时,这个向量是完全空的。因此,任何访问元素的尝试,即使是my_map[0][0],都将超出范围!

如何解决?

您应该使用resize()push_back()或两者的组合来填充向量,例如:

代码语言:javascript
复制
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子句来处理不同的字母,您还可以创建一个映射:

代码语言:javascript
复制
map<char, Field::Fieldtype> mapfield; 

您可以使用以下内容填充您的地图:

代码语言:javascript
复制
mapfield['S'] = Field::Fieldtype::Sky;
...

然后你可以重写你的循环:

代码语言:javascript
复制
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]]);  

一种更简单但更脏的替代方法是定义:

代码语言:javascript
复制
enum Fieldtype:char {River='R',Building='B',Earth='E',Sky='S', ...};

在循环中,使用以下内容填充字段:

代码语言:javascript
复制
my_map[x].push_back(static_cast<Fieldtype>(array[x][y]));  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55319447

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档