Eine Matrix mit vector



  • Hallo, ich habe eine matrix so erstellt

    vector<vector<bool> > occupied(width, vector<bool>(height));
    

    und habe zwei Fragen, und zwar, wie geht das, wenn man std namespace nicht verwendet? Meine sämtlichen Versuche führten zu fehlern. Und dann, ist sie standardmäßig für alle Elemente auf 0 gesetzt? Und falls nicht, wie setzt man alle elemente am einfachsten alle auf 0?



  • Namal schrieb:

    und habe zwei Fragen, und zwar, wie geht das, wenn man std namespace nicht verwendet? Meine sämtlichen Versuche führten zu fehlern.

    Du schreibst vor jedes Element aus dem namespace std einfach ein std::

    std::vector<std::vector<bool> > occupied(width, std::vector<bool>(height));
    

    Namal schrieb:

    Und dann, ist sie standardmäßig für alle Elemente auf 0 gesetzt? Und falls nicht, wie setzt man alle elemente am einfachsten alle auf 0?

    std::vector ruft für alle seine Elemente den Defaultkonstruktor auf - der im Falle von bool alle Werte auf false setzt.

    ---

    Dir ist hoffentlich bewusst dass deine Matrix eine Liste von Listen ist? Das macht Sinn wenn die Zeilen eine variable Spaltenzahl und die Matrix eine variable Zeilenzahl hat.

    Falls die Dimensionen der Matrix statisch sind solltest du einen eindimensionalen vector der Größe n*m verwenden und die zweidimensionalen Indizes beim ZUgriff auf eindimensionale umrechnen.

    index_1d = zeile * spalten_zahl + spalte
    

    ---

    Grüße,
    Ethon


  • Mod

    Namal schrieb:

    Hallo, ich habe eine matrix so erstellt

    vector<vector<bool> > occupied(width, vector<bool>(height));
    

    Das ist aber keine Matrix (im Sinne von einer rechteckigen 2D-Struktur). Das ist eine Liste von Listen. Schließlich kann jede deiner "Zeilen" eine andere Länge haben. Du benutzt diese Möglichkeit zwar nicht, aber sie ist da und du bezahlst die Laufzeitkosten dafür.
    Matrixartige Alternativen:
    -Alle Dimensionen fest: Array von Arrays
    -Länge der Zeilen fest: vector von Arrays (std::array natürlich. Ein vector von einem rohen Array geht nicht).
    -Alle Dimensionen dynamisch: 1D-vector und Indizes selber ausrechnen.

    und habe zwei Fragen, und zwar, wie geht das, wenn man std namespace nicht verwendet?

    Dazu musst du die benötigten Symbole im momentanen Namensraum bekannt machen. Z.B. using name_des_symbols; . Oder du entleerst den gesamten Namensraum in den momentanen Namensraum mit using namespace XXX; . Kommt so etwas nicht ziemlich früh in Lehrbüchern dran?

    Meine sämtlichen Versuche führten zu fehlern. Und dann, ist sie standardmäßig für alle Elemente auf 0 gesetzt? Und falls nicht, wie setzt man alle elemente am einfachsten alle auf 0?

    Alle Elemente in Vectoren werden "value initialized", wenn du nichts anderes angibst (es gibt viele Möglichkeiten, andere Werte anzugeben. Die zähle ich nicht alle auf. Guck dir die verschiedenen Konstruktoren eines vector in einer Referenz an.) Bei einem bool (und anderen PODs) ist das eine Initialisierung mit 0/false.

    Noch etwas wichtiges: vector<bool> ist problematisch. Da dachten die Macher des Standards vor 25 Jahren, sie wären ganz clever und haben ein paar Sonderregeln vorgeschrieben um zu zeigen, wie toll die STL ist. Ging aber nach hinten los. Der vector<bool> ist nicht so wie andere Vectoren, der wichtigste Unterschied ist, dass Referenzen und Zeiger auf seine Elemente nicht richtig funktionieren. Falls du nicht die speziellen Eigenschaften des vector<bool> benötigst (-> Google was die da gemacht haben), dann nimm lieber vector<char> oder ähnliches.

    P.S.: Schreib bitte in klarer, grammatikalisch richtiger Sprache. Wie du siehst, haben Ethon und ich deine Frage nach namespaces vollkommen unterschiedlich verstanden, weil

    wie geht das, wenn man std namespace nicht verwendet?

    mehrdeutig ist.



  • Ethon schrieb:

    Du schreibst vor jedes Element aus dem namespace std einfach ein std::

    std::vector<std::vector<bool> > occupied(width, std::vector<bool>(height));
    

    oder, um nicht alles mit std::-Präfixen vollzukleistern, obendrüber ein

    using std::vector;
    

Anmelden zum Antworten