2012-12-02 77 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

當使用下標運算符來訪問映射中的鍵不存在,但是,相應的元素被插入。對象之前被刪除並不重要,如果它不存在,它仍然會被插入。

要訪問地圖中的所有元素,您不要使用鍵,而是要在地圖上使用迭代器。這樣就不會插入新的元素。