Ошибка компиляции 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
,