В чем смысл .begin () и .end ()?

В каких случаях в массивах библиотеки C ++ полезно иметь функции-члены .begin() и .end()?

На cplusplus.com пример использования - перебор массива:

for ( auto it = myarray.begin(); it != myarray.end(); ++it )

Но

for (int i = 0; i < myarray.size(); i++)

можно использовать для этого.


person milennalim    schedule 20.08.2015    source источник
comment
begin() и end() работают для каждого контейнера STL.   -  person dhke    schedule 20.08.2015
comment
без него вы не смогли бы использовать его в цикле for на основе диапазона.   -  person NathanOliver    schedule 20.08.2015
comment
Если вы используете простые массивы, придерживайтесь простых индексов или указателей. Но как только вы используете контейнеры из стандартной библиотеки C ++, вы должны использовать итераторы, чтобы использовать общий синтаксис для всех контейнеров.   -  person Serge Ballesta    schedule 20.08.2015
comment
std :: begin и std :: end работают для std :: array   -  person James    schedule 20.08.2015
comment
Не говоря уже о том, что end() часто используется как ненайденное значение многими стандартными алгоритмическими функциями.   -  person Banex    schedule 21.08.2015


Ответы (4)


begin() и end() возвращают итераторы. Итераторы обеспечивают единый синтаксис для доступа к различным типам контейнеров. На первый взгляд они могут показаться излишеством для обхода простого массива, но учтите, что вы можете написать тот же код для обхода списка или карты.

Такой единый доступ к различным контейнерам позволит вам писать алгоритмы, которые работают со всеми из них, без знания их внутренней структуры. Цикл for от начала до конца - это всего лишь первая часть гораздо большей мозаики. Просто просмотрите список стандартных алгоритмов, чтобы оценить мощь этой простой абстракции.

person Maksim Solovjov    schedule 20.08.2015

Весь смысл стандартных контейнеров заключается в возможности их изменять и использовать тот же синтаксис. Если у вас был связанный список, первый синтаксис все еще работает.

Также он эквивалентен указателю. i - это индекс, поэтому myarray [i] немного медленнее, чем он.

person Robert Jacobs    schedule 20.08.2015
comment
... и, что более важно, наличие одного и того же синтаксиса для итерации по контейнеру означает, что вы можете написать шаблон, который будет работать для любого из них. - person Jules; 21.08.2015
comment
Большинство неравнодушных указывают на незначительную разницу. stackoverflow.com/questions/2524233/ - person Robert Jacobs; 21.08.2015

Помимо общего с другими контейнерами, begin, end полезно для для диапазона

for (const auto& e : myarray)
person Jarod42    schedule 20.08.2015

Теперь попробуйте перебрать связанный список. Единственный эффективный способ - переходить от одного элемента к другому, пока не дойдете до конца.

person Graham    schedule 21.08.2015