Вот простой случай, когда я нахожу Max of Array.
Я пытаюсь использовать автоматический итератор в массиве, переданном в мою функцию. Когда я использую один и тот же код в своем теле функции без ошибок.
Ссылка внутри функции max создает ошибку компиляции
cpp:7:14: error: invalid range expression of type 'int *'; no viable 'begin' function available
for (auto& x: array){
^ ~~~~~
Вот мой текущий код, я включил ссылку на обычное использование в "normalMax" и встроенную функцию основного тела.
Я хочу знать, почему итератор в функции "max" создает ошибку
#include <iostream>
//max num
//causes an error
int max(int* array){
int max = 0;
for (auto& x: array){
if (x >max)
max = x;
}
return max;
};
//normal behavior
int normalMax(int* array){
int max = 0;
for (int i=0; i<4; i++){
if (i >max)
max = i;
}
return max;
};
int main(){
int A[] = {1,2,3,4,5};
int B[] = {5,6,10,100};
int max = 0;
//Works no Error
for (auto& x: B){
if (x >max)
max = x;
}
std::cout <<max;
//100
normalMax(B);
//max(B);
//compile error
return 0;
}
Если вы хотите передать массив функции, чтобы компилятор мог вывести ее длину, вам нужно передать ее в качестве ссылки не через [разложившийся] указатель:
template <std::size_t N>
int max(int const (&array)[N]) {
int max = 0;
for (auto& x: array) {
if (x >max) {
max = x;
}
}
return max;
}
В качестве побочного примечания: после определения функции нет точки с запятой. Кроме того, эта функция не особенно полезна, так как вам, скорее всего, скорее вернет позицию максимального элемента, а не только его значение: позиция определяется неявно и может нести информацию. Конечно, как только вы найдете правильную позицию, вы также должны вернуть правильное лучшее значение, которое на самом деле является самой правой версией максимума.
template<typename array_t>int max(array_t &a);
array
на самом деле указатель. Не как массив.