【问题标题】:Erasing elements from a list inside a hash_map从 hash_map 内的列表中擦除元素
【发布时间】:2012-06-23 21:05:02
【问题描述】:

我使用以下结构:

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>*>

非常感谢您

【问题讨论】:

    标签: c++ list iterator hashmap


    【解决方案1】:

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

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

    改用引用:

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

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

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

    【讨论】:

    • 这很好,只需添加 &。但我仍然不太明白为什么。现在我没有列表的副本,而是指向它的引用(指针?)。那么为什么我仍然可以做类似 lista.begin() 而不是 lista -> begin() 的事情呢?
    【解决方案2】:

    变量 lista 是否具有我可以从 hash_map 或它的副本中获得的相同列表?

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

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

    使用此代码,您无需使用(*it).second 的副本,而是直接使用引用。

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      相关资源
      最近更新 更多