Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

The error reads:

request for member 'begin', 'end' in 'arr' which is non class type int[5], unable to deduce from expression error.

My code:

#include <iostream>
using namespace std;

int main()
{
    int * mypointer;

    int arr[5] = {1,3,5,7,9};

    mypointer = arr;

    for(auto it = arr.begin(); it != arr.end(); ++it) {
        cout<<*mypointer<<endl;

        mypointer++;
    }

    return 0;
}
like image 882
Sal Rosa Avatar asked Jan 30 '13 01:01

Sal Rosa


2 Answers

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.

like image 39
user1329482 Avatar answered Oct 30 '22 14:10

user1329482


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()
}
like image 97
GManNickG Avatar answered Oct 30 '22 13:10

GManNickG