С приходом нового стандарта эти две свободные функции появились в STL, в библиотеке итераторов (#include <iterator>
). Кроме того, в примерах кода часто можно увидеть, что они используются на STL контейнерах вместо собственных методов .begin()
и .end()
:
#include <iostream>
#include <vector>
#include <iterators>
using namespace std;
int main()
{
vector<int> v{1, 2, 3, 4, 5};
for (auto it = begin(v); it != end(v); ++it)
{
cout << "Number: " << *it << endl;
}
return 0;
}
Мне хорошо понятно, что эти функции отлично подходят для RAW-массивов, т.е. если в примере выше заменить:
vector<int> v{1, 2, 3, 4, 5};
на
int v[] = {1, 2, 3, 4, 5};
или даже
int v[]{1, 2, 3, 4, 5};
То весь остальной код менять не нужно. Удобно, причём мы защищены от подсовывания указателя вместо массива. Но почему они применяются для STL контейнеров?
Поиск по интернету дал только один ответ: для унификации. И только.
Т.е. ни по “кошерности” ни по скорости два этих подхода не отличаются. Чисто для единства вида.
Если у кого есть другие предположения - милости просим в дискуссию.
Ссылки