it-swarm.com.de

.Begin () oder .end () kann nicht für ein Array verwendet werden

Der Fehler lautet:

anfrage für Member 'begin', 'end' in 'arr', das nicht der Klassentyp int [5], .__ ist. Fehler können nicht aus dem Ausdruck abgeleitet werden.

Mein 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;
}
20
Sal Rosa

Arrays haben keine Member-Funktionen, da sie kein Klassentyp sind. Das sagt der Fehler.

Sie können stattdessen std::begin(arr) und std::end(arr) aus dem <iterator>-Header verwenden. Dies funktioniert auch mit Typen, die do über .begin()- und .end()-Member verfügen, durch Überladen:

#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()
}
40
GManNickG

Bei einem Standard-C-Array mit fester Länge können Sie einfach schreiben

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

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

Der Compiler erledigt die Arbeit hinter den Kulissen, sodass keine Start- und End-Iteratoren erstellt werden müssen.

3
user1329482

In C++ sind Arrays nicht Klassen und haben daher keine any -Member-Methoden. Sie verhalten sich in manchen Zusammenhängen wie Zeiger. Sie können dies nutzen, indem Sie Ihren Code ändern:

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

Dies bedeutet natürlich, dass mypointer und it beide dieselbe Adresse enthalten, sodass Sie nicht beide Adressen benötigen.

1
Code-Apprentice

Sehr spät, aber ich denke, es ist erwähnenswert, dass:

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)
}
0
Roshan Mehta

Vielleicht ist hier ein sauberer Weg, um es mit Vorlagen und Lambdas in c ++ 14 zu tun:

Definieren:

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

Und dann in der Hauptsache:

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; });
0
Jeff Moellmer

Eine Sache, die ich für Sie hervorheben möchte, ist, dass Sie wirklich kein separates int * pflegen müssen, um die Array-Elemente dereferenzieren zu können. Abgesehen von den Elementen, auf die andere Elemente aufmerksam gemacht haben.

Mit einem moderneren Ansatz ist der Code sowohl lesbarer als auch sicherer:

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

Wenn Sie das Lambda im zweiten Beispiel verwenden, können Sie bei Bedarf eine beliebige Verarbeitung der Elemente durchführen. In diesem Beispiel zeige ich nur die Verdoppelung jedes Elements, aber Sie können stattdessen etwas Bedeutenderes im Lambda-Körper tun.

Hoffe das macht Sinn und hilft.

0