Erstellen eines Vektors von Vektoren in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden des Standardkonstruktors zum Erzeugen eines Vektors von Vektoren in C++
  2. Verwenden der Funktion rand zum Füllen eines Vektors von Vektoren mit beliebigen Werten in C++
  3. Verwenden der bereichsbasierten Schleife zum Ändern jedes Elements eines Vektors in C++
Erstellen eines Vektors von Vektoren in C++

In diesem Artikel wird erklärt, wie man einen Vektor von Vektoren in C++ erzeugt.

Verwenden des Standardkonstruktors zum Erzeugen eines Vektors von Vektoren in C++

Da das Erzeugen eines Vektors von Vektoren das Konstruieren einer zweidimensionalen Matrix bedeutet, werden wir die Konstanten LENGTH und WIDTH definieren, die als Konstruktorparameter angegeben werden. Die Notation, die benötigt wird, um einen ganzzahligen Vektor von Vektoren zu deklarieren, ist vector<vector<int> > (das Leerzeichen nach dem ersten < dient nur der besseren Lesbarkeit).

Im folgenden Beispiel deklarieren wir im Wesentlichen eine 4x6-dimensionale Matrix, auf deren Elemente mit der [x][y]-Notation zugegriffen werden kann und die mit Literalwerten initialisiert wird. Beachten Sie, dass wir auch auf die Elemente des 2d-Vektors zugreifen können, indem wir die Methode at zweimal mit gegebenen Positionen aufrufen.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::setw;
using std::vector;

constexpr int LENGTH = 4;
constexpr int WIDTH = 6;

int main() {
  vector<vector<int> > vector_2d(LENGTH, vector<int>(WIDTH, 0));

  vector_2d[2][2] = 12;
  cout << vector_2d[2][2] << endl;

  vector_2d.at(3).at(3) = 99;
  cout << vector_2d[3][3] << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

12
99

Verwenden der Funktion rand zum Füllen eines Vektors von Vektoren mit beliebigen Werten in C++

Ein Vektor von Vektoren wird oft in mehreren linearen Algebra- oder Grafik-Workflows verwendet. Daher ist es üblich, einen zweidimensionalen Vektor mit zufälligen Werten zu initialisieren. Die Initialisierung relativ großer 2D-Vektoren mit Hilfe der Initialisierungsliste kann umständlich sein, daher sollte man Schleifeniterationen und die Funktion rand verwenden, um beliebige Werte zu erzeugen.

Da in diesem Fall keine kryptografisch sensible Operation durchgeführt wird, erzeugt die Funktion rand, die mit dem aktuellen Zeitargument geseedet wird, ausreichend zufällige Werte. Wir erzeugen eine Zufallszahl im Intervall von [0, 100) und geben gleichzeitig jedes Element auf der Konsole aus.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::setw;
using std::vector;

constexpr int LENGTH = 4;
constexpr int WIDTH = 6;

int main() {
  vector<vector<int> > vector_2d(LENGTH, vector<int>(WIDTH, 0));

  std::srand(std::time(nullptr));
  for (auto &item : vector_2d) {
    for (auto &i : item) {
      i = rand() % 100;
      cout << setw(2) << i << "; ";
    }
    cout << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

83; 86; 77; 15; 93; 35;
86; 92; 49; 21; 62; 27;
90; 59; 63; 26; 40; 26;
72; 36; 11; 68; 67; 29;

Verwenden der bereichsbasierten Schleife zum Ändern jedes Elements eines Vektors in C++

Im Allgemeinen kann die Deklaration zweidimensionaler Matrizen mit std::vector, wie in den vorherigen Beispielen gezeigt, für latenzkritische Anwendungen ziemlich ineffizient und rechenintensiv sein. Zeitkritische Anwendungen deklarieren Matrizen in der Regel mit der alten C-Schreibweise [][]. Auf der positiven Seite kann die std::vector-Matrix mit einer bereichsbasierten Schleife iteriert werden, wie im folgenden Beispiel gezeigt.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::setw;
using std::vector;

constexpr int LENGTH = 4;
constexpr int WIDTH = 6;

int main() {
  vector<vector<int> > vector_2d(LENGTH, vector<int>(WIDTH, 0));

  for (auto &item : vector_2d) {
    for (auto &i : item) {
      i = rand() % 100;
      cout << setw(2) << i << "; ";
    }
    cout << endl;
  }
  cout << endl;

  // Multiply Each Element By 3
  for (auto &item : vector_2d) {
    for (auto &i : item) {
      i *= 3;
    }
  }

  for (auto &item : vector_2d) {
    for (auto &i : item) {
      cout << setw(2) << i << "; ";
    }
    cout << endl;
  }

  return EXIT_SUCCESS;
}

Ausgabe:

83; 86; 77; 15; 93; 35;
86; 92; 49; 21; 62; 27;
90; 59; 63; 26; 40; 26;
72; 36; 11; 68; 67; 29;

249; 258; 231; 45; 279; 105;
258; 276; 147; 63; 186; 81;
270; 177; 189; 78; 120; 78;
216; 108; 33; 204; 201; 87
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ Vector