Alex
Alex

Reputation: 315

Erasing elements from a list inside a hash_map

Im using the following structure:

hash_map<string, list<time_t>>

When I initially fill the hash map with the information I read from a text file, I have no problem inserting elements to those time_t lists.

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

As you can see, if the key string is not in the table, I create a list with one time_t value and insert the pair on the table. On following apeareances of that same key, I just push the new time_t element on the already existing list and works fine.

I want to do the opposite now: erase elements of those lists.

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

This code is not eliminating elements from those lists.

I suppose the problem starts on this line:

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

Does the variable lista have the same list I can get from the hash_map or a copy of it? If it is a copy, I undestand the reason it's not working. However, I still dont understand why it did work inserting elements.

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

Is there a way of erasing elements from the list using an aproach similar to what I'm doing, or would I have to change the whole structure of the hash_map to something like

hash_map<string, list<time_t>*>

Thank you very much in advance

Upvotes: 1

Views: 549

Answers (2)

πάντα ῥεῖ
πάντα ῥεῖ

Reputation: 1

Does the variable lista have the same list I can get from the hash_map or a copy of it?

Yes lista is a copy, you're doing an assignment.

However, I still dont understand why it did work inserting elements.

With this code, you don't use a copy of (*it).second but the reference directly.

Upvotes: 1

hmjd
hmjd

Reputation: 121971

The erase() code is operating on a copy of the lists, not on the actual lists in the hashmap. This creates a copy:

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

Use a reference instead:

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

The push_front() operates correctly because no copy is being made, the code accesses the list in the hashmap directly:

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

Upvotes: 2

Related Questions