Crea vettore di vettori in C++

Jinku Hu 12 ottobre 2023
  1. Usa il costruttore predefinito per creare un vettore di vettori in C++
  2. Usa la funzione rand per riempire il vettore di vettori con valori arbitrari in C++
  3. Usa il bucle basato su intervallo per modificare ogni elemento del vettore di vettori in C++
Crea vettore di vettori in C++

Questo articolo spiegherà come creare un vettore di vettori in C++.

Usa il costruttore predefinito per creare un vettore di vettori in C++

Poiché creare un vettore di vettori significa costruire un array bidimensionale, definiremo le costanti LENGTH e WIDTH da specificare come parametri del costruttore. La notazione necessaria per dichiarare un vettore intero di vettori è vector<vector<int> > (lo spazio dopo il primo < è solo a scopo di leggibilità).

Nell’esempio seguente, dichiariamo essenzialmente un array dimensionale 4x6, a cui è possibile accedere agli elementi utilizzando la notazione [x][y] e inizializzata utilizzando valori letterali. Nota che possiamo anche accedere agli elementi del vettore 2d chiamando il metodo at due volte con date posizioni.

#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;
}

Produzione:

12
99

Usa la funzione rand per riempire il vettore di vettori con valori arbitrari in C++

Un vettore di vettori viene spesso utilizzato in più flussi di lavoro grafici o algebrici lineari. Pertanto, è comune avere un vettore bidimensionale inizializzato con valori casuali. Inizializzare vettori 2D relativamente più grandi usando l’lista degli inizializzatori può essere complicato, quindi si dovrebbe utilizzare l’iterazione del bucle e la funzione rand per generare valori arbitrari.

Poiché questo caso non comporta alcuna operazione crittograficamente sensibile, la funzione rand seminata con l’argomento del tempo corrente genererà valori sufficientemente casuali. Stiamo generando un numero casuale nell’intervallo di [0, 100) e allo stesso tempo inviamo ogni elemento alla console.

#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;
}

Produzione:

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

Usa il bucle basato su intervallo per modificare ogni elemento del vettore di vettori in C++

In generale, dichiarare matrici bidimensionali usando std::vector come mostrato negli esempi precedenti può essere abbastanza inefficiente e pesante per le applicazioni critiche per la latenza. Le applicazioni sensibili al tempo di solito dichiarano gli array usando la notazione C-style [][] vecchia scuola. Sul lato positivo, la matrice std::vector può essere iterata con un bucle basato su intervalli, come mostrato nell’esempio seguente.

#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;
}

Produzione:

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
Autore: 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

Articolo correlato - C++ Vector