Я понимаю, что могу получить ссылку iterator, вызвав back()
, но почему бы не вернуть его с помощью push_back()
? Это по соображениям производительности? Или это из-за безопасности исключений (похоже, почему pop_back()
не возвращает всплывающее значение)? В любом случае, пожалуйста, объясните.
Почему контейнеры push_back в vector <> и list <> не возвращают ссылку на вставленный элемент?
Ответ 1
Различные функции insert
возвращают итератор по очень простой причине: вызывающий не обязательно знает, как получить итератор для этого элемента. map::insert
и set::insert
возвращают одно, потому что в противном случае вызывающему нужно будет искать элемент.
Когда вы выполняете vector::push_back
, вы знаете, где находится вставленный элемент. Это --vector.end()
. Вам не нужно искать его; всегда это место. Вы можете получить его в постоянное время и довольно быстрое постоянное время.
Поэтому нет смысла возвращать то, что пользователь уже знает.
Ответ 2
Я не знаю, есть ли официальная причина, но самое непосредственное, что приходит мне в голову, - это производительность. Если вы посмотрите на большинство использований push_back
и push_front
, возвращаемое значение не будет использоваться. Если элемент нажат, это не так важно, как то, что он нажал.
Зачем возвращать несвободное значение, которое почти никогда не используется?
Ответ 3
Причина в том, что vector
предоставляет метод insert
, который возвращает итератор во вставленную позицию. Стандарт согласуется с тем, что push_back
не возвращает значение, но некоторые формы insert
будут, когда это возможно и целесообразно.