Почему push_back в контейнерах vector <> и list <> не возвращает ссылку на вставленный элемент? - PullRequest
14 голосов
/ 23 января 2012

Я понимаю, что могу получить ссылку итератор , вызвав back(), но почему бы не вернуть его также с push_back()?Это из соображений производительности?Или это связано с безопасностью исключений (аналогично тому, почему pop_back() не возвращает выбранное значение)?В любом случае, пожалуйста, объясните.

Ответы [ 3 ]

16 голосов
/ 23 января 2012

Различные insert функции возвращают итератор по очень простой причине: вызывающая сторона не обязательно знает, как получить итератор для этого элемента. map::insert и set::insert возвращают единицу, потому что в противном случае вызывающая сторона должна будет искать элемент.

Когда вы делаете vector::push_back, вы знаете , где находится вставленный элемент. Это --vector.end(). Вам не нужно искать это; это всегда это место. Вы можете получить это в постоянное время, и довольно быстро постоянное время при этом.

Так что нет смысла возвращать то, что пользователь уже знает.

2 голосов
/ 23 января 2012

Я не знаю, есть ли официальная причина, но самое непосредственное, что приходит мне в голову, это производительность.Если вы посмотрите на большинство случаев использования push_back и push_front, возвращаемое значение не используется.То, куда толкается элемент, не так важно, как то, что он толкается.

Зачем возвращать несвободное значение, которое почти никогда не используется?

0 голосов
/ 23 января 2012

Причина в том, что vector предоставляет метод insert, который возвращает итератор во вставленную позицию.Стандарт последовательный в том, что push_back не возвращает значение, но некоторые формы insert будут, когда доступно и уместно.

...