C++ Arrays und generics?



  • Hi,

    ich bin C++ Anfänger und habe versucht mich mit Arrays auseinander zusetzten.
    Im Internet habe ich auch einige Anleitungen zu diesem Thema gefunden
    (bspw.: [url] http://www.willemer.de/informatik/cpp/array.htm [/url])

    da werden Arrays in etwa so benutzt:

    int lotto[6] = { 12, 7, 45, 2, 21, 9 };
    

    Jetzt habe ich aber auch so Sachen wie:

    array<String^>^ serialPorts = nullptr;
    

    (http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.getportnames#Y639)

    haben diese <> was mit generischen Klassen zu tun?
    und was sollen die ^^?

    und wie kann ich ein Array deklarieren, ohne die Anzahl an Element angeben zu müssen und dann später erst die Wertzuweisung zu machen?

    also etwa so:
    String namen[];

    namen = {"Axel", "Lisa"}

    oder eben direkt von einer Methode dann, also
    namen = obj.getArray();

    geht das irgendwie?

    wäre dankbar, wenn mir vll jemand helfen könnte



  • Du vermischt hier offenbar C++ mit C++/CLI. Letzteres ist eine andere Sprache. Wenn du C++ lernen willst, dann kann ich dir nur sehr dazu raten, dir ein gutes Buch zuzulegen und das durchzuarbeiten.



  • lieschen89 schrieb:

    haben diese <> was mit generischen Klassen zu tun?
    und was sollen die ^^?

    In C++ ist dieses '^' der bitweise XOR-Operator, hat da also nix zu suchen. Die Größer-als und Kleiner-als Zeichen schließen sog. template-parameter ein, die einfach nur Typen umfassen.
    Beispiel:

    template<typename a, typename b>
    struct MyStruct
    {};
    //...
    
    MyStruct<int, float> a;
    

    Dazu findest du ungeheuer viel im Netz.



  • Zur Erklärung: C++/CLI ist eine Adaptersprache zwischen C++ und .net. Typ^ bezeichnet darin eine .net-Referenz (ich nenn das einfach mal so), d. h. ein Verweis auf ein Objekt, das von der virtuellen Maschine des .net-Frameworks gemanagt wird. In gleicher Weise handelt es sich bei array hier nicht um std::array aus dem C++-Standard, sondern um eine Generic-Klasse aus dem .net-Framework; das ist so eine Art Laufzeit-Template.

    Wenn du ein Array unbestimmter Länge in C++ bereiben willst, nimm std::vector:

    #include <vector>
    
    // ...
    
    std::vector<int> v;
    
    v.resize(10);
    v[9] = 10;
    

    Siehe dazu auch http://en.cppreference.com/w/cpp/container/vector



  • seldon schrieb:

    Wenn du ein Array unbestimmter Länge in C++ bereiben willst, nimm std::vector

    Hört doch mal auf mit eurem std::vector , es gibt verschiedene Container für verschiedene Situationen (in denen das Laufzeitverhalten zählt), und nicht nur diesen mystischen std::vector :

    std::vector wenn man oft Elemente am Ende einfügt
    std::deque wenn man oft Elemente am Ende und am Anfang einfügt
    std::list wenn man viele Elemente einfügt oder gelöscht werden

    Dazu gibt es noch passende Adapter als Zubehör - std::stack (LIFO) und std::queue (FIFO), die eine Art Wrapper um andere Container darstellen un die in Klammern gesetzte Prinzipien zur Ordnung verwenden.
    Was ganz exotisches ist die priority_queue , aber das kannste googlen.

    Und dann noch Assioziative Container... 🕶



  • Stroustrup schrieb:

    • Vector is the default container
    • prefer vector for storing elements unless there's a good reason not to


  • quoter schrieb:

    Stroustrup schrieb:

    • Vector is the default container
    • prefer vector for storing elements unless there's a good reason not to

    Wo hat er das gesagt?
    Laufzeitverhalten ist ein sehr guter Grund - neben wie man auf Elemente zugreift, sie geordnet haben will, etc. .



  • Da: http://www.stroustrup.com/Programming/17_free_store.ppt So um Seite 4 rum.

    Btw:

    std::list wenn man viele Elemente einfügt oder gelöscht werden

    Das halte ich nicht für einen guten Grund für std::list .



  • quoter schrieb:

    Da: http://www.stroustrup.com/Programming/17_free_store.ppt So um Seite 4 rum.

    Btw:

    std::list wenn man viele Elemente einfügt oder gelöscht werden

    Das halte ich nicht für einen guten Grund für std::list .

    Ja, du hast Recht. Wenn man oft Elemente in der Mitte oder am Anfang (Bei am Anfang einfügen ist der Unterschied gigantisch zu std::vector !) einfügt (Edit) / löscht.



  • Hacker schrieb:

    Wenn man oft Elemente in der Mitte oder am Anfang (Bei am Anfang einfügen ist der Unterschied gigantisch zu std::vector !) einfügt (Edit) / löscht.

    std::list hat eine katastrophable Laufzeit fuer beliebige Einfuege- und Loeschoperationen. Da nimmt man dann schon einen hoehenbalancierten Baum. In C++ kann man da z.B. std::set verwenden.



  • icarus2 schrieb:

    Hacker schrieb:

    Wenn man oft Elemente in der Mitte oder am Anfang (Bei am Anfang einfügen ist der Unterschied gigantisch zu std::vector !) einfügt (Edit) / löscht.

    std::list hat eine katastrophable Laufzeit fuer beliebige Einfuege- und Loeschoperationen. Da nimmt man dann schon einen hoehenbalancierten Baum. In C++ kann man da z.B. std::set verwenden.

    Es geht um Sequentielle Container.



  • std::list ist laufzeittechnisch ausgesprochen selten eine gute Idee, weil es sich dabei nicht um eine kompakte Datenstruktur handelt -- das bedeutet, dass du jede Menge Cache-Misses kriegst und deine Zugriffe um mehrere Größenordnungen verlangsamt werden, weil du dauernd zum Hauptspeicher rauslaufen musst.

    Außerdem musst du in aller Regel in die Mitte einer Liste erstmal hineinkommen, womit wir wieder bei O(n) sind. Aufgrund der Speicherverteilung, die bei einer verketteten Liste zu erwarten ist, ist diese sequentielle Suche bei einer Liste deutlich langsamer (richtig deutlich langsamer) als Suche und Verschiebung zusammen es bei einem Vektor wären.

    Dieser Vortrag dürfte dich interessieren; insbesondere die Stelle ab etwa 44:30.





  • Mist! Schon wieder von Wolf verarscht! GGGGRRRRHRHH! Danke für die Aufklärung, der hat mir voll ins Hirn geschissen. Buch liegt jetzt im Müll.



  • seldon schrieb:

    Nachtrag: Link zum Graphen, der Herrn Stroustrup da verloren gegangen ist.

    Jo,aber wofür ist das jetzt? Zugriff auf Zufällige stellen? Einfügen?



  • Hacker schrieb:

    Mist! Schon wieder von Wolf verarscht! GGGGRRRRHRHH! Danke für die Aufklärung, der hat mir voll ins Hirn geschissen. Buch liegt jetzt im Müll.

    Ich hab das Buch auch, so schlecht ist das jetzt nicht. Halt nur für Anfänger.



  • IrgendeinName schrieb:

    Hacker schrieb:

    Mist! Schon wieder von Wolf verarscht! GGGGRRRRHRHH! Danke für die Aufklärung, der hat mir voll ins Hirn geschissen. Buch liegt jetzt im Müll.

    Ich hab das Buch auch, so schlecht ist das jetzt nicht. Halt nur für Anfänger.

    WAS? Eben nicht für Anfänger! Das Buch solltest du ganz schnell wegwerfen, es bringt dir ein gefährliches und gefährlich falsch erklärtes C/C++-gemisch bei, das viele wichtige Konzepte außen vor lässt...



  • IrgendeinName schrieb:

    Hacker schrieb:

    Mist! Schon wieder von Wolf verarscht! GGGGRRRRHRHH! Danke für die Aufklärung, der hat mir voll ins Hirn geschissen. Buch liegt jetzt im Müll.

    Ich hab das Buch auch, so schlecht ist das jetzt nicht. Halt nur für Anfänger.

    http://www.c-plusplus.net/forum/272350 😉



  • Lists sind doch gut fürs Splicing? Und fürs einfügen von Elementen in der Mitte.
    Bei Vector müssen da ja viele Sachen kopiert werden...
    Aber bei Zufallszugriff soll man Vector verwenden. Einfügen nur am Ende, so hab ich dass schon öfter im Internet und anderswo gelesen.

    Hacker schrieb:

    IrgendeinName schrieb:

    Hacker schrieb:

    Mist! Schon wieder von Wolf verarscht! GGGGRRRRHRHH! Danke für die Aufklärung, der hat mir voll ins Hirn geschissen. Buch liegt jetzt im Müll.

    Ich hab das Buch auch, so schlecht ist das jetzt nicht. Halt nur für Anfänger.

    WAS? Eben nicht für Anfänger! Das Buch solltest du ganz schnell wegwerfen, es bringt dir ein gefährliches und gefährlich falsch erklärtes C/C++-gemisch bei, das viele wichtige Konzepte außen vor lässt...

    Ich schmeiß sicher kein 40€ Buch weg. Verkaufen ist eine bessere Idee.
    Hab mir dots Link angesehen, wirklich keine Gute Idee das Ding fertigzulesen.



  • IrgendeinName schrieb:

    Lists sind doch gut fürs Splicing? Und fürs einfügen von Elementen in der Mitte.

    Splicing ja, Einfügen in der Mitte nur, wenn du die Position vorher kennst. Sonst ist das Verschieben, was bei einem Vektor gebraucht wird, immer noch schneller als das Suchen in der Liste.

    IrgendeinName schrieb:

    Ich schmeiß sicher kein 40€ Buch weg. Verkaufen ist eine bessere Idee.

    Toll. Dann haben wir in ein paar Wochen den nächsten hier im Forum, der versucht hat, mit diesem Buch etwas zu lernen und sich darüber ärgert, dass ihm jemand für diesen Schund Geld abgenommen hat. Wahrscheinlich vertickt der es dann auch weiter. Sic transit gloria mundi.



  • Ich benutze Listen eigentlich hauptsächlich dann, wenn ich erreichen will, dass Iteratoren nach der Manipulation des Containers gültig bleiben. Hier ist std::list m.E.n. der günstigste Container.


Anmelden zum Antworten