从hash_map中的列表中删除元素

时间:2012-06-21 15:20:36

标签: c++ list iterator hashmap

我使用以下结构:

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 个答案:

答案 0 :(得分:2)

erase()代码正在列表的副本上运行,而不是hashmap中的实际列表。这会创建一个副本:

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

改为使用引用:

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

push_front()正常运行,因为没有复制,代码直接访问hashmap中的列表:

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

答案 1 :(得分:1)

  

变量lista是否与hash_map或其副本有相同的列表?

lista是副本,你正在做作业。

  

但是,我仍然不明白它为什么插入元素。

使用此代码,您不会直接使用(*it).second的副本,而是使用参考。