Нет, функция-член std::unordered_set::erase
является единственной функцией, предназначенной для использования при удалении элементов из набора, а документы говорят:
Сложность
Учитывая экземпляр c unordered_set:
1) Средний регистр: постоянный, худший случай: c.size ()
[...]
Так почемуэто c.size()
в худшем случае?Обратите внимание, что erase
имеет возвращаемое значение:
Возвращаемое значение
1-2) Итератор, следующий за последним удаленным элементом.
[...]
Функция должна найти «следующий элемент».std::unordered_set
сохраняет свои данные в так называемых списках сегментов.В идеале, это следующий доступный слот в том же списке, что и тот, который содержит элемент, который вы удаляете.В худшем случае, это последний доступный слот в каком-то другом ведре (и, следовательно, он масштабируется с размером контейнера).Это зависит от истории вставки / удаления контейнера.Вы можете взглянуть на реализацию libcxx
здесь , там есть цикл, пересекающий узлы в списке сегментов (механизм хорошо объяснен ответом @ eeroika ).
Кроме того, не это (также из документов по erase
):
Ссылки и итераторы для стертых элементов недействительны
Такразыменование итератора it
после его удаления из набора - неопределенное поведение.Вы можете исправить это по
auto it = set_of_ints.begin();
const int value = *it;
set_ot_ints.erase(it);
std::cout << "removed element is: " << value << "\n";