不能在数组上使用.begin()或.end()

Sal*_*osa 25 c++ arrays pointers iterator c++11

错误如下:

请求'arr'中的成员'begin','end'是非类型int [5],无法从表达式错误中推断出来.

我的代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

GMa*_*ckG 46

数组没有成员函数,因为它们不是类类型.这就是错误所说的.

您可以使用std::begin(arr)std::end(arr)来自<iterator>标题.这也适用于该类型.begin().end()成员,通过超载:

#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()
}
Run Code Online (Sandbox Code Playgroud)


use*_*482 5

对于标准的固定长度的 C 数组,你可以只写

int c_array[] = {1,3,5,7,9}, acc = 0;

for (auto it : c_array) {
    acc += it;
}
Run Code Online (Sandbox Code Playgroud)

编译器执行幕后工作,无需创建所有这些开始和结束迭代器。