+1 Daumen
1k Aufrufe

Aufgabe (2. Teil nur, im Code ab Zeile 36):

Declare an empty 2D vector called vector_2d.
Remember, that a 2D vector is a vector of vector<int>.

Add vector1 to vector_2d dynamically using push_back.
Add vector2 to vector_2d dynamically using push_back.

Display the elements in vector_2d using the at() method.

Change vector1.at(0) to 1000.

Display the elements in vector_2d again using the at() method

Display the elements in vector1.


Link zum Code:

https://repl.it/@limonade1234/UnfortunateFarflungNetframework


Problem:
Ich benutze die Pushback Methode um den gesamten Vektor in den Vektor2d z kopieren aber ich glaube, da liegt das Problem und ich weiss nicht wie ich einen bestehenden Vektor zu einem neuen Vektor addieren kann.


Code: 

#include <iostream>
#include <vector>

using namespace std;
int i;


int main() {
  //Initialize vectors
  vector<int> vector1 {};
  vector<int> vector2 {};
 
  //add Elements
  vector1.push_back(10);
  vector1.push_back(20);
 
  vector2.push_back(100);
  vector2.push_back(200);
 
  //Display Elements
  cout << "\n \t VECTOR 1 \n" << endl;
  cout << "Size of vectr: " << vector1.size() << endl;
  cout << "First element: " << vector1.at(0) << endl;
  cout << "Secon element: " << vector1.at(1) << endl;
  cout << "Adr. Element1: " << &vector1.at(0) << endl;
  cout << "Adr. Element2: " << &vector1.at(1) << endl;
 
  cout << "\n \t VECTOR 2 \n" << endl;
  cout  << "Size of vectr: " << vector2.size() << endl;
  cout << "First element: " << vector2.at(0) << endl;
  cout << "Secon element: " << vector2.at(1) << endl;
  cout << "Adr. Element1: " << &vector2.at(0) << endl;
  cout << "Adr. Element2: " << &vector2.at(1) << endl;
 
 
  //2. Teil der Aufgabe

//Declare an empty 2d Vecotor
 
  vector <vector<int> > vector_2d{};
 
  //add vector1 to vector2d with pushback
  vector_2d.push_back(vector1);
 
  //Display size and elements vector2d
  cout << "Size of vectr2d: " << vector_2d.size() << endl;

  return 0;
}

Avatar von

1 Antwort

+1 Daumen
 
Beste Antwort

Hallo limonade,

ich weiss nicht wie ich einen bestehenden Vektor zu einem neuen Vektor addieren kann.

'.. hinzu fügen kann' wäre der bessere Ausdruck, addieren ist was anderes. Denke einfach es wäre ein int. Du kannst schreiben:

vector<int > v;
v.push_back(42); // füge ein int dem vector hinzu
vector<vector<int> > vv;
vv.push_back(v); // füge einen vector dem vector hinzu

Also Dein Code

//add vector1 to vector2d with pushback
  vector_2d.push_back(vector1);

ist daher völlig in Ordnung.

Die Ausgabe der Elemente geht z.B. so:

for( int i=0; i< vector_2d.size(); ++i){
for( int k=0; k < vector_2d.at(i).size(); ++k )
    {
        cout << vector_2d.at(i).at(k) << " ";
    }
    cout << endl;
}

Gruß Werner
Avatar von

Es ist mega krass, es gab mir immer eine Fehlermeldung aus. Jetzt hab ich aber das hinzufügen so gemacht:

  // add vector1, vector2 to vector2d with pushback
  vector_2d.push_back(vector1);
  vector_2d.push_back(vector2);

Und so klappt es.


Frage
Das Ausgeben verstehe ich nicht ganz, wieso geht das nicht mit einer einfachen Anweisung, bzw wieso brauche ich dafür eine for-Schleife ? Wo kann ich das "lernen" Daten auszugeben per Schleife ?



Eigene Idee
Ich will ja einen 2d Vektor mit folgenden Koordinaten ausgeben: 

 0,0 0,1
 1,0 1,1

 
Dann müsste ich sagen,

cout << vector_2d.at(0).at(0);
cout << vector_2d.at(0).at(1);
cout << vector_2d.at(1).at(0);
cout << vector_2d.at(1).at(1);

Eigentlich sind diese vier Anweisungen eine einzige Anweisung der Form: 

cout << vector_2d.at(i).at(i);

Das Problem hier ist, dass ich hier nur Koordinaten der 00,11,22, ausgeben kann,
also löse ich das Problem mit:

cout << vector_2d.at(i).at(k);

Bis hier verstehe ich es.


Frage 2

Und die Schleife selbst, kann ich nur so schwammig nachvollziehen. 
Also ich weiss nicht, ich hätte es selbst nie so hingekriegt.

wieso geht das nicht mit einer einfachen Anweisung, bzw wieso brauche ich dafür eine for-Schleife ?

Es gibt keine 'fertige Funktion' um einen std::vector auszugeben. Und es macht auch keinen Sinn. Du kannst sie selber als Funktion definieren, aber erstens musst Du dazu noch vieles wissen und zweitens ist so etwas bei Klassen aus dem Standard nicht immer sinnvoll, da sie innerhalb eines Programms auch für unterschiedliche Dinge benutzt werden. Und somit müsste auch die Ausgabe unterschiedlich aussehen.


Eigentlich sind diese vier Anweisungen eine einzige Anweisung der Form:
cout << vector_2d.at(i).at(i);

Wenn \(i\) z.B. den Wert 0 hast, dann gibst Du mit dieser Zeile das Element vector_2d(0,0) aus; was denn sonst?


Und die Schleife selbst, kann ich nur so schwammig nachvollziehen.
Also ich weiss nicht, ich hätte es selbst nie so hingekriegt.

Üben, üben und vor allen Dingen selber programmieren. Ändere das Programm nach Deinen Vorstellungen und schau Dir an, was passiert.

Ein Vorteil beim Lernen ist auch, zu wissen, wie man mit dem Debugger umgeht. Welche Entwicklungsumgebung benutzt Du?

Gruß Werner

Danke !


Ich arbeite mit xCode.

Ein anderes Problem?

Stell deine Frage

Willkommen bei der Stacklounge! Stell deine Frage einfach und kostenlos

x
Made by a lovely community