Разница между vector :: begin() и std :: begin()

В то время как итерация вектора в c++, я заметил, что это begin() функция в стандартной библиотеке, а также begin() в качестве функции члена vector класса. Что, если таковые имеются, является разницей между ними и которая должна использоваться над другой?

Пример:

vector<int> numbers;
//Code to put values in my vector
for (vector<int>::iterator i = numbers.begin(); i < numbers.end(); i++)
    cout << *i << '\n';

против:

vector<int> numbers;
//Code to put values in my vector
for (vector<int>::iterator i = std::begin(numbers); i < std::end(numbers); i++)
    cout << *i << '\n';

Ответ 1

std::begin() был добавлен в С++ 11, чтобы упростить создание общего кода (например, в шаблонах). Самой очевидной причиной этого является то, что простые C- .begin() массивы не имеют методов, поэтому нет .begin(). Таким образом, вы можете использовать std::begin() с массивами C-стиля, а также контейнеры в стиле STL, имеющие свои собственные begin() и end().

Если вы пишете код, который не является шаблоном, вы можете игнорировать std::begin(); ваши коллеги-программисты, вероятно, посчитают это странным, если вы вдруг начнете использовать его повсюду только потому, что он новый.

Ответ 2

Реализация std::begin() для векторов просто вызывает std::vector<T>::begin(), поэтому нет никакой разницы между ними в этом конкретном случае.

Где std::begin() входит в свои собственные алгоритмы:

template<typename Container>
void my_algorithm(Container c) {
    using std::begin;
    using std::end;
    auto const start = begin(c);  // ADL will find the appropriate overload
    auto const finish = end(c);
    // ... rest of code ...
}