2012-12-02 43 views
3

所以,我得到这个:C++地图与结构

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; 
} 

,由于某种原因,它仍然是编辑所有条目,做我需要使用新作,每一个结构条目?

+4

'if(PeopleMap [i] == PeopleMap.end())'是你的实际代码的一部分吗?因为这不会编译。 –

回答

2

PeopleMap.end()不返回有效的参数,它就像一个鬼节点。

例如,一种方式,地图迭代可能是:

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

见,PeobleMap就像是在最后一个幽灵节点表示,你必须到达终点。 在以前for,如果你想访问映射值,你可以这样做:

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

所以,如果你使用迭代器,你不必检查删除值,你将能够在编辑参数(更少的键)

0

以下是不正确的:

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

你大概的意思是说

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

当使用下标运算符来访问映射中的键不存在,但是,相应的元素被插入。对象之前被删除并不重要,如果它不存在,它仍然会被插入。

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