vector mit zugriff auf struct komponenten



  • #include <vector>
    #include <iostream>
    
    using namespace std;
    
    struct Matrix {
        int zahl;
        bool istWeg;
    
    };
    
    int main()
    {
       vector< vector<Matrix> > _2Dmatrix;
    
       //Platz für 3 mal 3 Einträge beschaffen
       _2Dmatrix.resize(3);
       for(int i = 0; i < _2Dmatrix.size(); ++i)
          _2Dmatrix[i].resize(3);
    
       //ab hier jetzt von _2Dmatrix[0][0] bis _2Dmatrix[2][2] bearbeiten
       bool b = true;
       for(int i = 0; i < 3; ++i)
          for(int j = 0; j < 3; ++j)
          {
             Matrix m = {i * j, b = !b};
             _2Dmatrix[i][j] = m;
          }
    
       cout << _2Dmatrix[1][2].zahl << ' ' << _2Dmatrix[1][2].istWeg << '\n';
       cout << _2Dmatrix[1][2].zahl << ' ' << _2Dmatrix[2][0].istWeg << '\n';
    }
    


  • SeppJ schrieb:

    Was macht das "Matrix" am Anfang von Zeile 7?

    Deine Bezeichner sind übrigens schrecklich: struct Matrix stellt keine MAtrix dar. vector<vector<unsigned>> ist so manches, aber keine Matrix. Bezeichner mit Unterstrich am Anfang sind reserviert.

    zeile 7 ist Strukturname
    wenn man auf komponenten in struct zugreifen will muss man doch ein deklarieren

    Beispiele:
    
      struct person {         /* deklariert den Strukturtyp person */
        int   alter;
        float gewicht;
        char  name[25];
      } adam, eva;            /* deklariert Variable des Typs person */
    
      struct person paul;     /* deklariert weitere Variable des Typs person */
      person paula;           /* Deklaration nur in C++ zulaessig bzw.
                                 in C nach vorherigem typedef */
    
      paul.alter = 13;        /* Zuweisung von Werten an die */
      paul.gewicht = 47.8;    /* einzelnen Komponenten */
    

    strukturtyp ist Matrix(Zeile7)
    variable des typs Matrix ist _2Dmatrix
    _2Dmatrix ist wie paul bzw paula und dann will ich dadurch zugriff auf komponenten im struct haben.


  • Mod

    Ich habe das vermutlich nicht gefragt, weil ich tatsächlich eine Erklärung brauchte...



  • SeppJ schrieb:

    Ich habe das vermutlich nicht gefragt, weil ich tatsächlich eine Erklärung brauchte...

    hab dich falsch verstanden.
    ich wollte nur damit sagen dass ich danach arbeite und leider hat das nicht gestimmt.



  • Belli schrieb:

    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    struct Matrix {
        int zahl;
        bool istWeg;
        
    };
     
    int main()
    {
       vector< vector<Matrix> > _2Dmatrix;
       
       //Platz für 3 mal 3 Einträge beschaffen
       _2Dmatrix.resize(3);
       for(int i = 0; i < _2Dmatrix.size(); ++i)
          _2Dmatrix[i].resize(3);
       
       //ab hier jetzt von _2Dmatrix[0][0] bis _2Dmatrix[2][2] bearbeiten
       bool b = true;
       for(int i = 0; i < 3; ++i)
          for(int j = 0; j < 3; ++j)
          {
             Matrix m = {i * j, b = !b};
             _2Dmatrix[i][j] = m;
          }
          
       cout << _2Dmatrix[1][2].zahl << ' ' << _2Dmatrix[1][2].istWeg << '\n';
       cout << _2Dmatrix[1][2].zahl << ' ' << _2Dmatrix[2][0].istWeg << '\n';
    }
    

    wieso muss ich vector<vector<Matrix>> xyz schreiben anstatt vector<vector<int>> xyz;

    wieso kann ich hier kein Wert zuweisen ?

    //Platz für n mal n Einträge beschaffen 
    	_2Dmatrix.resize(reihen);
    	for (int i = 0; i < _2Dmatrix.size(); ++i)
    		_2Dmatrix[i].resize(SPALTEN);
    
    	//ab hier jetzt von _2Dmatrix[0][0] bis _2Dmatrix[2][2] bearbeiten 
    	for (unsigned int i = 0; i < reihen; i++) {
    		for (unsigned int x = 0; x < SPALTEN; x++) {
    			_2Dmatrix[i][x] = x; // hier kann ich nicht zuweisen wegen struct komponenten 
    //mit array wäre arr[i][x] = i; somit kann ich ausgeben 0 1 2 3...9
    		}
    		cout << endl;
    	}
    


  • yeurandom92 schrieb:

    wieso muss ich vector<vector<Matrix>> xyz schreiben anstatt vector<vector<int>> xyz;

    Was macht das int deiner Meinung nach?



  • manni66 schrieb:

    yeurandom92 schrieb:

    wieso muss ich vector<vector<Matrix>> xyz schreiben anstatt vector<vector<int>> xyz;

    Was macht das int deiner Meinung nach?

    ein vector mit elementen typ integer

    zitiert ausm skript
    vector<double> v ; // Noch l e e r e r Vektor f u e r double−Werte
    vector<int> w( 10 ) ; // Vektor mi t Pl a t z f u e r 10 i n t−Werte



  • Nein.



  • yeurandom92 schrieb:

    manni66 schrieb:

    yeurandom92 schrieb:

    wieso muss ich vector<vector<Matrix>> xyz schreiben anstatt vector<vector<int>> xyz;

    Was macht das int deiner Meinung nach?

    ein vector mit elementen typ integer

    zitiert ausm skript
    vector<double> v ; // Noch l e e r e r Vektor f u e r double−Werte
    vector<int> w( 10 ) ; // Vektor mi t Pl a t z f u e r 10 i n t−Werte

    Und was willst du dort reinstecken?



  • yeurandom92 schrieb:

    wieso muss ich vector<vector<Matrix>> xyz schreiben anstatt vector<vector<int>> xyz;

    Weil Du in Deinem Eingangsposting so getan hast, als ob Du den Typ Matrix in Deinen Vektor stecken willst:

    yeurandom92 schrieb:

    //wenn man mit array machen will dann klappt das
    //Matrix arr[x][y];

    Da kommt schließlich auch kein int vor. Da hast Du ein Array vom Typ Matrix, und in meinem Beispiel hast Du einen Vektor mit Vektoren vom Typ Matrix.

    yeurandom92 schrieb:

    wieso kann ich hier kein Wert zuweisen ?

    for (unsigned int x = 0; x < SPALTEN; x++) {
                _2Dmatrix[i][x] = x;
    

    Weil x vom Typ unsigned int ist, der Vektor aber Elemente vom Typ Matrix beheimatet.
    Das würde mit Deinem

    Matrix arr[x][y];
    

    auch nicht funktionieren.
    Du könntest aber natürlich

    for (unsigned int x = 0; x < SPALTEN; x++) {
                _2Dmatrix[i][x].zahl = x;
    



  • Belli schrieb:

    yeurandom92 schrieb:

    wieso muss ich vector<vector<Matrix>> xyz schreiben anstatt vector<vector<int>> xyz;

    Weil Du in Deinem Eingangsposting so getan hast, als ob Du den Typ Matrix in Deinen Vektor stecken willst:

    yeurandom92 schrieb:

    //wenn man mit array machen will dann klappt das
    //Matrix arr[x][y];

    Da kommt schließlich auch kein int vor. Da hast Du ein Array vom Typ Matrix, und in meinem Beispiel hast Du einen Vektor mit Vektoren vom Typ Matrix.

    yeurandom92 schrieb:

    wieso kann ich hier kein Wert zuweisen ?

    for (unsigned int x = 0; x < SPALTEN; x++) {
                _2Dmatrix[i][x] = x;
    

    Weil x vom Typ unsigned int ist, der Vektor aber Elemente vom Typ Matrix beheimatet.
    Das würde mit Deinem

    Matrix arr[x][y];
    

    auch nicht funktionieren.
    Du könntest aber natürlich

    for (unsigned int x = 0; x < SPALTEN; x++) {
                _2Dmatrix[i][x].zahl = x;
    

    danke dir für die ausführliche Erklärung
    ich habe daraus eine Lösung gebastelt
    ich benutze vector<vector<Matrix>>matrix und ich kann auf komponenten zugreifen.

    würde es trotzdem reichen wenn ich schreibe

    struct Matrix{
    int wert;
    bool istWeg;
    };
    vector<vector<int>> matrix;
    //matrix.istWeg
    
    //oder
    
    vector<vector<Matrix>>matrix;
    //matrix.istweg
    

    Ich habe noch nicht verstanden bzw ich weiß noch nicht was man in <...> eingeben soll um auf komponenten zuzugreifen. <Matrix> oder <int> und warum?



  • Ein Quell deiner der Verwirrung könnte hier die Namensgebung (auch wichtig!) sein.

    Unter einer Matrix versteht man im allgemeinen ein zweidimensionales Gebilde mit einer definierten Anzahl Zeilen und Spalten. Das ist bei dir modelliert als vector<vector< ... >> .

    Das, was du "Matrix" nennst (die Klasse), modelliert hingegen keine Matrix, sondern das Element in der Matrix. Die Klasse sollte daher besser MatrixElement statt Matrix heißen.



  • wob schrieb:

    Ein Quell deiner der Verwirrung könnte hier die Namensgebung (auch wichtig!) sein.

    Unter einer Matrix versteht man im allgemeinen ein zweidimensionales Gebilde mit einer definierten Anzahl Zeilen und Spalten. Das ist bei dir modelliert als vector<vector< ... >> .

    Das, was du "Matrix" nennst (die Klasse), modelliert hingegen keine Matrix, sondern das Element in der Matrix. Die Klasse sollte daher besser MatrixElement statt Matrix heißen.

    Bedeutet: wenn ich vector xyz benutze, ganz egal ob 2d vector<vector<>>xyz oder 1d vektor.
    wenn ich zugriff auf komponenten in struct mit Vektor realisieren will, muss ich in
    <...> "structname" eingeben. In diesem Fall Matrixelement ?

    wenn ich int, float oder was anderes eingebe, dann ist es nur ein vektor mit dementspechend int , float usw. elementen.

    Danke fuer die Hilfe an euch.
    Wieder was dazu gelernt.



  • yeurandom92 schrieb:

    würde es trotzdem reichen wenn ich schreibe

    struct Matrix{
    int wert;
    bool istWeg;
    };
    vector<vector<int>> matrix;
    //matrix.istWeg
    
    //oder
    
    vector<vector<Matrix>>matrix;
    //matrix.istweg
    

    Ich habe noch nicht verstanden bzw ich weiß noch nicht was man in <...> eingeben soll um auf komponenten zuzugreifen. <Matrix> oder <int> und warum?

    Im ersten Fall

    vector<vector<int>> matrix;
    

    ist matrix doch nur der Name des Vektors, ähnlich wie in

    int matrix[10][10];
    

    die Elemente des Vektors sind aber int - Werte, auf die Du mit

    matrix[2][2]
    

    zugreifen kannst.
    Du willst aber

    Matrix array[10][10];
    

    in einem Vektor haben, und da ist die Entsprechung

    vector< vector<Matrix> > vektor;
    

    mal davon abgesehen, dass Du dem Vektor jetzt erst mal Elemente hinzufügen musst.



  • Und dann kannst du per

    typedef vector<vector<MatrixElement>> Matrix;
    

    einen Aliasnamen deklarieren, so daß du dann

    Matrix matrix;
    

    schreiben kannst.


Anmelden zum Antworten