#c #boost #hashtable #unordered-map
#c #boost #хеш-таблица #unordered-map
Вопрос:
Я использую C boost unordered_map
хэш-таблицу. Я могу использовать local_iterator
для обхода определенного сегмента. Теперь я хочу стереть некоторые элементы в этом ведре.
ShmHashMap::local_iterator it = hash_table_->begin(bucket_idx);
while(it != hash_table_->end(bucket_idx)) {
if(it->second >= now_time) {
it ;
continue;
}
hash_table_->erase(it);// this usage is not supported
// although I can `hash_table_->erase(it->first)`, this usage is inefficient
it ;
}
Итак, есть ли какой-нибудь способ стереть элемент с помощью local_iterator
?
Ответ №1:
Предполагая, что boost::unordered_map::erase
это работает так же, как std::unordered_map::erase
, тогда последовательность:
hash_table_->erase(it);
it ;
вызывает неопределенное поведение, поскольку erase
делает недействительным it
.
Однако вы можете сделать:
it = hash_table_->erase(it);
потому erase
что возвращает итератор, следующий за удаленным.