Ошибка компиляции std::max_element, C++

Пожалуйста, смотрите следующие 2 примера:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    int n;
    std::cin>>n;
    std::vector<int> V(n);
    // some initialization here
    int max = *max_element(&V[0], &V[0]+n);
}

Это дает следующую ошибку компиляции:

ошибка C3861: 'max_element': идентификатор не найден

Но когда я заменяю вызов *max_element(&V[0], &V[0]+n); в *max_element(V.begin(), V.end()); он компилирует:

#include <iostream>
#include <algorithm>
#include <vector>

int main()
{
    int n;
    std::cin>>n;
    std::vector<int> V(n);
    // some initialization here
    int max =*max_element(V.begin(), V.end());
}

Может ли кто-нибудь объяснить мне, почему они разные?

1 ответ

Решение

Это связано с зависимым от аргумента поиском (он же ADL).

поскольку max_element определяется в пространстве имен ::std, ты должен действительно написать std::max_element везде. Но, когда вы используете его во втором виде

max_element(V.begin(), V.end());

поскольку V.begin() а также V.begin() определили тип в ::std, ADL пинает и находит std::max_element,

Другие вопросы по тегам