Ссылка на итератор Auto Array в функции

0

Вот простой случай, когда я нахожу 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;
}
  • 1
    array на самом деле указатель. Не как массив.
  • 2
    Цикл дальнего действия не может работать с указателем, только с массивами и определенными классами.
Показать ещё 8 комментариев
Теги:
arrays
c++11

1 ответ

4
Лучший ответ

Если вы хотите передать массив функции, чтобы компилятор мог вывести ее длину, вам нужно передать ее в качестве ссылки не через [разложившийся] указатель:

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;
}

В качестве побочного примечания: после определения функции нет точки с запятой. Кроме того, эта функция не особенно полезна, так как вам, скорее всего, скорее вернет позицию максимального элемента, а не только его значение: позиция определяется неявно и может нести информацию. Конечно, как только вы найдете правильную позицию, вы также должны вернуть правильное лучшее значение, которое на самом деле является самой правой версией максимума.

  • 0
    Вы также можете использовать этот template<typename array_t>int max(array_t &a);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню