2015-03-13 2 views
1

Я бы хотел, чтобы std :: unordered_set :: insert() не выбрасывал исключения. Использует ли std :: unordered_set :: reserve() эту цель, если я зарезервировал максимальное количество элементов, которые я когда-либо вставлял в unordered_set?Можно ли исключить unordered_map :: insert из метаданных?

+1

Нет, это не так. Кроме того, 'unordered_map' или' unordered_set'? –

+0

Чтобы не допустить исключения, вам нужно написать идеальный код. Исключения существуют по важным причинам (некоторые из них могут быть не под вашим контролем), и вам необходимо их обработать. Если вы пытаетесь вставить элемент в набор, и вставка не удалась, вы должны выяснить, почему он терпит неудачу. Если вы действительно хотите предотвратить исключения, вам нужно будет проверить все возможные сценарии, которые вы можете придумать, и обработать их изящно в своем коде. Даже тогда вам просто нужно надеяться, что в вашей программе или в системе пользователя ничего не пойдет не так. – blh83

ответ

0

К сожалению, reserve() может использоваться только для управления, когда будет передел, поэтому итераторы останутся действительными, по крайней мере, до тех пор, пока не будет вставлено зарезервированное количество элементов. Вставка может по-прежнему бросать bad_alloc (с распределителем по умолчанию) в пределах зарезервированного диапазона.

Для гарантии nothrow единственной возможностью было бы знать заранее, какие ключи могут быть вставлены, а затем вставить их в точку, где исключение можно легко обрабатывать.

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