Vektoren in C++



  • Hallo zusammen.
    Ich schreibe z.Z. meine Bachelorarbeit und muss unter anderen Programme mit C++ schreiben, um bestimmte Sachverhalte zu untersuchen.
    Ich hab schon viel mit SoloLearn (ein online Lernprogramm für C++) und mit Büchern über C++ gemacht.
    Dort wird aber so gut wie kein Wort über benötigte Pakete verloren.

    Das Meiste, was ich benötigte an Paketen, war bereits auf dem Computer, mit dem ich arbeite.

    Um auf den Punkt zu kommen:
    Kann mir jemand bitte mal ein kleines Beispiel machen, wie ich ein Vektor definiere und diesen auslesen kann UND natürlich noch, welche Pakete ich dafür benötige.

    ---------------------------------------------------------------------------------------------------------------
    Wenn ich ein Beispiel nehme, welches ich gefunden habe:

    #include <vector>
    #include <iostream>
    
    int main(){
    
        std::vector<int> v = {0, 1, 2, 3, 4, 5};
    
        for (const int& i : v) 
            std::cout << i << ' ';
        std::cout << '\n';
    }
    

    Schreibt mir meine Konsole (ABC heißt das Programm):

    ABC.cpp:6:43: error: in C++98 ‘v’ must be initialized by constructor, not by ‘{...}’
    std::vector<int> v = {0, 1, 2, 3, 4, 5};
    ^
    ABC.cpp:6:43: error: could not convert ‘{0, 1, 2, 3, 4, 5}’ from ‘<brace-enclosed initializer list>’ to ‘std::vector<int>’
    ABC.cpp:8:25: error: range-based ‘for’ loops are not allowed in C++98 mode
    for (const int& i : v) // access by const reference

    Ihr habt sicherlich schon mitbekommen, das ich in Sachen C++ noch recht grün hinter den Ohren bin........daher würde ich um ein Idiotensichere Antwort bitten. 😉

    Danke im Voraus!!!



  • Das ist ein Hinweis darauf, dass du eine veraltete GCC-Version nutzt, die standardmäßig noch nach den Regeln des C++-Standards von 1998 arbeitet. Du kannst einen neueren Standard erzwingen mit -std=c++14, bzw. -std=c++11, falls der Compiler für ersteres zu alt ist.

    Unabhängig davon ist es aber angeraten, zur aktuellen GCC-Version 7.2 zu wechseln.



  • Danke für die Antwort.
    Wie gesagt, ich bin noch grün hinter den Ohren.

    Muss ich dieses std=c++14 bzw. std=c++11 als Befehl eingeben?
    Kannst du eine Seite empfehlen, wo ich mir die 7.2 er Version herunterladen kann?



  • Queiser schrieb:

    Muss ich dieses std=c++14 bzw. std=c++11 als Befehl eingeben?
    Kannst du eine Seite empfehlen, wo ich mir die 7.2 er Version herunterladen kann?

    Wie kompilierst du denn überhaupt deinen Code?

    Gibst du von Hand g++ dateiname.cpp ein oder hast du ein Makefile oder eine CMakeLists.txt?

    Also wenn du von Hand den g++ aufrufst, dann nimm einfach g++ -std=c++11 dateiname.cpp . Wobei du dann dringend auch noch immer Warnungen einschalten solltest, also g++ -Wall -Wextra -pedantic -std=c++11 dateiname.cpp . Sinnvoll sind auch noch Optimierungen (also -O2 oder -O3 ) bzw. Debuginformationen (mit -g ).

    PS: Neuer Compiler ist sicher sinnvoll, damit du auch C++14 und C++17-Änderungen nutzen kannst. Aber die wichtigsten Dinge sind erstmal in C++11 drin und das wird dein Compiler hoffentlich schon können (2011 ist ja auch schon 6 Jahre her). Daher: bring das erstmal ans laufen - updaten auf einen neuen Compiler kannst du immer noch, wenn wirklich nötig.


  • Mod

    Du hast das Programm doch wahrscheinlich so oder ähnlich übersetzt:

    g++ mein_code.cpp -o mein_programm
    

    Daraus machst du stattdessen:

    g++ mein_code.cpp -o mein_programm -std=c++14
    

    Wenn du schon dabei bist, am besten auch mehr Warnungen:

    g++ mein_code.cpp -o mein_programm -std=c++14 -Wall -Wextra
    

    Neue Versionen des GCC gibt es prinzipiell von der GCC-Projektseite, aber es ist sehr zu empfehlen, sie nicht von dort zu holen, denn da musst du sie erst noch selber bauen. Es gibt nämlich sicherlich fertig gebaute Pakete für dein Betriebssystem. Wie man dein Betriebssystem bedient oder dort Software installiert, musst du selber wissen.

    Ich würde aber allgemein sagen, dass es nicht so dringend ist, dass man als Anfänger die neueste Version eines Compilers hat. Hauptsache, nicht total veraltet.



  • Kurze Zwischenfrage,
    muss im Beispiel oben i als Referenz angegeben werden? Eigentlich ist das doch nur der Fall, wenn man die Werte im Vektor ändern möchte oder habe ich mein Buch falsch verstanden?



  • Zhavok schrieb:

    Kurze Zwischenfrage,
    muss im Beispiel oben i als Referenz angegeben werden? Eigentlich ist das doch nur der Fall, wenn man die Werte im Vektor ändern möchte oder habe ich mein Buch falsch verstanden?

    Joa, eine Referenz machst du, wenn du das Original verändern möchtest. Eine const-Referenz machst du, wenn du keine Kopie machen willst und das Original nicht verändern willst. Das bezieht sich mal auf benutzerdfinierte Datentypen.

    Bei fundamentalen Datentypen (int, float, long etc.) mache ich immer eine Kopie statt const-ref, weil eine Kopie bei fundamentalen Typen nicht wirklicher teurer ist als eine Referenz, ggf. sogar billiger ist, wenn der Compiler eine Referenz intern als Zeiger macht...


Log in to reply