2012-06-21 43 views
1

林內:刪除元素的hash_map

hash_map<string, list<time_t>> 

當我最初填補了哈希映射我從一個文本文件中讀取信息,我沒有問題,插入元素那些time_t的名單。

hash_t::iterator it = hash.find(origen); 

if (it != hash.end()) 
{ 
    (*it).second.push_front(fecha);   
} 
else 
{ 
    list<time_t> lista(1, fecha); 
    hash.insert(make_pair(origen, lista));   
} 

正如你所看到的,如果密鑰字符串不是在表中,我創建一個time_t的值列表,並插入桌子上的一對。在跟蹤同一個關鍵的行爲時,我只是將新的time_t元素推到已經存在的列表上,並且工作正常。

我想現在做相反的事情:擦除這些列表的元素。

hash_t::iterator it = hash.find(origen);    

if (it != hash.end()) 
{ 
    list<time_t> lista = (*it).second; 
    list<time_t>::iterator it2 = lista.begin(); 
    bool found = false; 

    while(it2 != lista.end() && !found) 
    { 
     time_t fecha2 = *it2;   
     if (abs((int) difftime(fecha, fecha2)) <= 2) 
     { 
      found = true; 
      lista.erase(it2); 
     } 
     else ++it2; 
    } 
} 

此代碼並未消除這些列表中的元素。

我想在這條線的問題開始:

list<time_t> lista = (*it).second; 

是否變量LISTA具有相同的列表,我可以從的hash_map或它的一個副本得到什麼?如果它是一個副本,我不能理解它不起作用的原因。但是,我仍然不明白爲什麼它插入元素。

(*it).second.push_front(fecha); 

有沒有使用類似於我在做什麼的形式給出擦除從列表中元素的方式,否則我將不得不到了hash_map的整體結構更改爲類似

hash_map<string, list<time_t>*> 

非常感謝您提前

回答

2

erase()代碼在列表的副本上運行,而不是在hashmap的實際列表中運行。這將創建一個副本:

list<time_t> lista = (*it).second; 

使用,而不是一個參考:

list<time_t>& lista = (*it).second; 

push_front()因爲沒有副本正在作出正確操作,訪問的代碼在hashmap直接在列表:

(*it).second.push_front(fecha); 
+0

這工作得很好,只需添加&。但我仍然不明白爲什麼。現在我沒有列表的副本,而是一個引用(指針?)。那麼爲什麼我仍然可以做像lista這樣的事情。begin()而不是lista - > begin()? – Alex

+0

它是:http://stackoverflow.com/questions/57483/what-are-the-differences-between-pointer-variable-and-reference-variable-in-c – Alex

1

變量lista是否具有我可以從hash_map或其副本獲得的相同列表?

lista是副本,你正在做一個任務。

但是,我仍然不明白爲什麼它沒有工作插入元素。

使用此代碼,您不使用(*it).second的副本,而是直接引用該參考。