I want to iterate an array inside a function. the following code won't compile.
void printArr(int arr[])
{
for (auto x : arr)
{
cout << x << endl;
}
}
I know arr is actually a pointer to the first element. Thanks for helping.
I want to iterate an array inside a function. the following code won't compile.
void printArr(int arr[])
{
for (auto x : arr)
{
cout << x << endl;
}
}
I know arr is actually a pointer to the first element. Thanks for helping.
The reason is that the range based loop needs an array type, a standard library container, or something with suitable begin
and end
iterators. In your function, arr
is just a pointer (a function parameter such as int arr[]
is adjusted to int* arr
).
From a practical perspective, the range based loop could not know how many elements to print, so it would make no sense for it to deal with a pointer.
You could try passing the array by reference instead.
template <size_t N>
void printArr(const int (&arr)[N])
{
for (auto x : arr)
{
cout << x << endl;
}
}
Where a template function has been used to allow for arrays of different lengths. You could also make the element type a template parameter:
template <typename T, size_t N>
void printArr(const T (&arr)[N])
{
....
It is because array arguments are depleted to pointers and range based loops require an array or a container type. You can instead try the following code:
template <typename T, size_t sz>
void printArr(const T (&arr)[sz])
{
for (auto x : arr)
{
cout << x << endl;
}
}
This code passes the reference of array instead of address.