Crear Vector de Vectores en C++

Jinku Hu 12 octubre 2023
  1. Usar Constructor por defecto para crear un vector de vectores en C++
  2. Usar la función rand para llenar el vector de los vectores con valores arbitrarios en C++
  3. Usar el bucle basado en el rango para modificar cada elemento del vector de los vectores en C++
Crear Vector de Vectores en C++

Este artículo explicará cómo crear un vector de vectores en C++.

Usar Constructor por defecto para crear un vector de vectores en C++

Dado que crear un vector de vectores significa construir un array bidimensional, definiremos las constantes LENGTH y WIDTH para especificar como parámetros constructores. La notación necesaria para declarar un vector entero de vectores es vector<vector<int> > (el espacio después del primer < es sólo para propósitos de legibilidad).

En el siguiente ejemplo, declaramos esencialmente un array dimensional de 4x6, a cuyos elementos se puede acceder utilizando la notación [x][y] e inicializarlos utilizando valores literales. Nótese que también podemos acceder a los elementos del vector 2d llamando dos veces al método at con posiciones dadas.

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

Resultado:

12
99

Usar la función rand para llenar el vector de los vectores con valores arbitrarios en C++

Un vector de vectores se utiliza a menudo en múltiples flujos de trabajo de álgebra lineal o gráficos. Por lo tanto, es común tener un vector bidimensional inicializado con valores aleatorios. La inicialización de vectores bidimensionales relativamente grandes utilizando la lista de inicialización puede ser engorrosa, por lo que se debe utilizar la iteración de bucle y la función rand para generar valores arbitrarios.

Como este caso no implica ninguna operación sensible a la criptografía, la función rand inicializada con el argumento del tiempo actual generará valores suficientemente aleatorios. Estamos generando un número aleatorio en el intervalo de [0, 100) y al mismo tiempo emitiendo cada elemento a la consola.

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

Resultado:

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

Usar el bucle basado en el rango para modificar cada elemento del vector de los vectores en C++

En general, la declaración de matrices bidimensionales utilizando std::vector como se muestra en los ejemplos anteriores puede ser bastante ineficiente y de gran carga computacional para aplicaciones críticas de latencia. Las aplicaciones sensibles al tiempo suelen declarar matrices usando la vieja escuela de la notación de estilo C [][]. En el lado positivo, del array std::vector puede ser iterada con un bucle basado en el rango, como se demuestra en el siguiente ejemplo.

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

Resultado:

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

Artículo relacionado - C++ Vector