2012-06-21 2 views
1

Im, используя следующую структуру:Удаления элементов из списка внутри 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, но ссылку напрямую.

Смежные вопросы