Как стереть элемент в boost unordered_map с помощью local_iterator? - PullRequest
0 голосов
/ 21 апреля 2019

Я использую 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 Ответ

1 голос
/ 21 апреля 2019

Если предположить, что boost::unordered_map::erase работает так же, как std::unordered_map::erase, то последовательность:

hash_table_->erase(it);
it++;

вызывает неопределенное поведение, потому что erase делает недействительным it.

Однако вы можете сделать:

it = hash_table_->erase(it);

потому что erase возвращает итератор, следующий за удаленным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...