【问题标题】:C++ map with a struct带有结构的 C++ 映射
【发布时间】:2012-11-20 06:31:17
【问题描述】:

所以,我得到了这个:

struct People_Info {
  bool isWorking;
  std::string name;
  int age;
  float height;
};
int counter = 0;
int random = urand(1, 4);
std::map<uin64, People_Info> PeopleMap;

现在,将调用一个函数,该函数将使用此结构在地图中创建一个条目,该结构将设置一些默认值:

PeopleMap[counter].isWorking = false;
PeopleMap[counter].name = "Mr";
PeopleMap[counter].age = 1;
PeopleMap[counter].height = 1.60f;
counter++;

现在,这是应该为新人创建条目的函数,但是,在整个脚本中,我将删除一些条目,所以如果我有 5 个元素,我会删除例如第二个,那么,我想编辑地图中每个人的一些变量:

for(int i = 0; i < 5 ; i++) {
  if(PeopleMap[i] == PeopleMap.end())  // Don't edit map entries that are erased
    continue;

  PeopleMap[i].isWorking = true;
}

现在,由于某种原因,它仍在编辑所有条目,我是否需要使用 new 为每个条目创建一个结构?

【问题讨论】:

  • if(PeopleMap[i] == PeopleMap.end()) 是您实际代码的一部分吗?因为那不编译。

标签: c++ dictionary struct


【解决方案1】:

PeopleMap.end() 没有返回有效参数,它就像一个幽灵节点。

例如,在 map 中进行迭代的方法可能是:

for(std::map<uin64, People_Info>::iterator it = PeopleMap.begin();it != PeopleMap.end() ;it++)

你看,PeobleMap最后就像一个幽灵节点,表示你已经走到了尽头。 在之前的for 中,如果您想访问地图值,您可以这样做:

it->first // uint64
it->second.isWorking

因此,如果您使用迭代器,则不必检查已擦除的值,并且可以在映射中的每一对中编辑参数(更少键)

【讨论】:

    【解决方案2】:

    当使用下标运算符访问映射中不存在的键时,会插入相应的元素。该对象之前被擦除无关紧要:如果它不存在,它仍然会被插入。

    要访问地图中的所有元素,您无需使用键,而是在地图上使用迭代器。这样就不会插入新元素。

    【讨论】:

      【解决方案3】:

      以下不正确:

      if(PeopleMap[i] == PeopleMap.end())
      

      你可能是想说

      if(PeopleMap.find(i) == PeopleMap.end())
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-02-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多