Cannot use .begin() or .end() on an array Cannot use .begin() or .end() on an array arrays arrays

Cannot use .begin() or .end() on an array


Arrays have no member functions as they aren't a class type. This is what the error is saying.

You can use std::begin(arr) and std::end(arr) from the <iterator> header instead. This also works with types that do have .begin() and .end() members, via overloading:

#include <array>#include <vector>#include <iterator>int main(){    int c_array[5] = {};    std::array<int, 5> cpp_array = {};    std::vector<int> cpp_dynarray(5);    auto c_array_begin = std::begin(c_array); // = c_array + 0    auto c_array_end = std::end(c_array);     // = c_array + 5    auto cpp_array_begin = std::begin(cpp_array); // = cpp_array.begin()    auto cpp_array_end = std::end(cpp_array);     // = cpp_array.end()    auto cpp_dynarray_begin = std::begin(cpp_dynarray); // = cpp_dynarray.begin()    auto cpp_dynarray_end = std::end(cpp_dynarray);     // = cpp_dynarray.end()}


For a standard fixed-length C array, you can just write

int c_array[] = {1,3,5,7,9}, acc = 0;for (auto it : c_array) {    acc += it;}

The compiler does the behind-the-scenes work, eliminating the need to create all those begin and end iterators.


In C++, arrays are not classes and therefore do not have any member methods. They do behave like pointers in some contexts. You can take advantage of this by modifying your code:

#include <iostream>using namespace std;int main(){    int * mypointer;    const int SIZE = 5;    int arr[SIZE] = {1,3,5,7,9};    mypointer = arr;    for(auto it = arr; it != arr + SIZE; ++it) {        cout<<*mypointer<<endl;        mypointer++;    }    return 0;}

Of course, this means that mypointer and it both contain the same address, so you don't need both of them.