В чем смысл .begin() и .end()?
В библиотеках библиотек С++, в каких случаях полезно использовать функции-члены .begin()
и .end()
?
На cplusplus.com используется пример для итерации по массиву:
for ( auto it = myarray.begin(); it != myarray.end(); ++it )
Но
for (int i = 0; i < myarray.size(); i++)
можно использовать для этого.
Ответы
Ответ 1
begin()
и end()
возвращают итераторы. Итераторы обеспечивают единообразный синтаксис для доступа к различным типам контейнеров. На первый взгляд они могут казаться излишним для прохождения простого массива, но считайте, что вы можете написать тот же код, чтобы пересечь список или карту.
Этот равномерный доступ к различным контейнерам позволит вам писать алгоритмы, которые работают на всех из них, не зная их внутренней структуры. Цикл от начала до конца - это всего лишь первая часть в гораздо большей мозаике. Просто просмотрите список стандартных алгоритмов, чтобы оценить силу этой простой абстракции.
Ответ 2
Весь смысл стандартных контейнеров - это возможность их изменять и использовать один и тот же синтаксис. Если у вас есть связанный список, первый синтаксис все еще работает.
Также это эквивалентно указателю. я - индекс, поэтому myarray [i] немного медленнее, чем он.
Ответ 3
В дополнение к общим для других контейнеров begin
, end
полезно для диапазона
for (const auto& e : myarray)
Ответ 4
Теперь попробуйте выполнить итерацию через связанный список. Единственный эффективный способ - переходить от одного пункта к другому, пока вы не достигнете конца.