33

错误内容如下:

对非类类型 int[5] 的“arr”中的成员“begin”、“end”的请求,无法从表达式错误中推断出来。

我的代码:

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

6 回答 6

55

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

您可以改用标头中的std::begin(arr)and 。这也适用于具有和成员的类型,通过重载: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()
}
于 2013-01-30T01:42:46.427 回答
5

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

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

for (auto it : c_array) {
    acc += it;
}

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

于 2017-07-13T19:35:29.493 回答
0

我想为您指出的一件事是,除了其他人已经指出的整个成员之外,您实际上不必维护单独的 int* 来取消引用数组元素。

使用更现代的方法,代码更具可读性和安全性:

#include <iostream>
#include <algorithm>
#include <array>
#include <iterator>
using namespace std;

int main()
{
    std::array<int, 5> cpp_array{1,3,5,7,9};

    // Simple walk the container elements.
    for( auto elem : cpp_array )
        cout << elem << endl;

    // Arbitrary element processing on the container.
    std::for_each( begin(cpp_array), end(cpp_array), [](int& elem) {
        elem *= 2;      // double the element.
        cout << elem << endl;
    });
}

如果需要,使用第二个示例中的 lambda 可以方便地对元素执行任意处理。在这个例子中,我只是展示了将每个元素加倍,但是你可以在 lambda 主体中做一些更有意义的事情。

希望这有意义并有所帮助。

于 2013-01-30T10:49:09.633 回答
0

在 C++ 中,数组不是类,因此没有任何成员方法。在某些情况下,它们确实表现得像指针。您可以通过修改代码来利用这一点:

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

当然,这意味着mypointerit都包含相同的地址,所以你不需要它们。

于 2013-01-30T01:50:09.157 回答
0

很晚了,但我认为值得一提的是:

void findavgTime(int n)
{
    int wt1[n];
    fill_wt(wt1,n); //Any method that puts the elements into wt1
    int wt2[3];
    int sum  = accumulate(begin(wt1), end(wt1), 0); // Fails but wt2[3] will pass. Reason: variable-sized array type ‘int [n]’ is not a valid template argument)
}
于 2018-02-28T15:11:06.077 回答
0

也许这是使用 c++14 中的模板和 lambda 的更简洁的方法:

定义:

template<typename Iterator, typename Funct>
void my_assign_to_each(Iterator start, Iterator stop, Funct f) {
    while (start != stop) {
        *start = f();
        ++start;
    }
}

template<typename Iterator, typename Funct>
void my_read_from_each(Iterator start, Iterator stop, Funct f) {
    while (start != stop) {
        f(*start);
        ++start;
    }
}

然后主要是:

int x[10];
srand(time(0));
my_assign_to_each(x, x+10, [] () -> int { int rn{}; rn = rand(); return rn; });
my_read_from_each(x, x+10, [] (int value) { std::cout << value << std::endl; });

int common_value{18};
my_assign_to_each(x, x+10, [&common_value] () -> int { return common_value; });
my_read_from_each(x, x+10, [] (int value) { std::cout << value << std::endl; });
于 2018-01-25T15:37:56.090 回答