Contenedor de vectores en C++ STL

Jinku Hu 12 octubre 2023
  1. Utilice std::vector para construir un array dinámica en C++
  2. Utilice std::vector para almacenar objetos struct en C++
  3. Utilice la función std::vector::swap para intercambiar elementos vectoriales en C++
Contenedor de vectores en C++ STL

Este artículo presentará varios métodos sobre cómo utilizar un contenedor vector en C++.

Utilice std::vector para construir un array dinámica en C++

std::vector es parte de la biblioteca de contenedores e implementa un array redimensionable dinámicamente que almacena elementos en un almacenamiento contiguo. Los elementos vector generalmente se agregan al final con las funciones integradas push_back o emplace_back. El contenedor vector se puede construir fácilmente con la lista de inicializadores como se muestra en el siguiente código de ejemplo: objeto arr. Además, se pueden almacenar valores estáticos de la lista de inicializadores en la expresión macro y expresar de manera concisa la operación de inicialización cuando sea necesario.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

#define INIT \
  { "Neque", "porro", "quisquam", "est", "qui", "dolorem", "ipsum", "quia" }

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  vector<string> arr = {"Neque", "porro",   "quisquam", "est",
                        "qui",   "dolorem", "ipsum",    "quia"};
  printVector(arr);

  cout << endl;

  vector<string> arr2 = INIT;
  printVector(arr2);

  cout << endl;

  return EXIT_SUCCESS;
}

Utilice std::vector para almacenar objetos struct en C++

std::vector se puede utilizar para almacenar estructuras definidas de forma personalizada e inicializarlas con la notación de lista entre corchetes similar al ejemplo anterior. Tenga en cuenta que, al agregar un nuevo elemento struct usando la función push_back, el valor debe pasarse como una lista entre llaves, y si hay varias estructuras anidadas dentro de una struct, se debe usar la notación correspondiente.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

struct cpu {
  string wine;
  string country;
  int year;
} typedef cpu;

int main() {
  vector<cpu> arr3 = {{"Chardonnay", "France", 2018}, {"Merlot", "USA", 2010}};

  for (const auto &item : arr3) {
    cout << item.wine << " - " << item.country << " - " << item.year << endl;
  }

  arr3.push_back({"Cabernet", "France", 2015});
  for (const auto &item : arr3) {
    cout << item.wine << " - " << item.country << " - " << item.year << endl;
  }

  return EXIT_SUCCESS;
}

Utilice la función std::vector::swap para intercambiar elementos vectoriales en C++

std::vector proporciona múltiples funciones integradas para operar en sus elementos, una de las cuales es swap. Se puede llamar desde el objeto vector y tomar otro vector como argumento para intercambiar su contenido. Otra función útil es size, que recupera el recuento de elementos actual en el objeto vector dado. Sin embargo, tenga en cuenta que existe una función similar llamada capacity que devuelve el número de elementos almacenados en el búfer asignado actualmente. A este último a veces se le asigna un tamaño mayor para evitar llamadas no esenciales a los servicios del sistema operativo. El siguiente código de ejemplo demuestra el escenario en el que las dos funciones devuelven valores diferentes.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  vector<int> arr4 = {1, 12, 45, 134, 424};
  vector<int> arr5 = {41, 32, 15, 14, 99};

  printVector(arr4);
  arr4.swap(arr5);
  printVector(arr4);

  cout << "arr4 capacity: " << arr4.capacity() << " size: " << arr4.size()
       << endl;

  for (int i = 0; i < 10000; ++i) {
    arr4.push_back(i * 5);
  }

  cout << "arr4 capacity: " << arr4.capacity() << " size: " << arr4.size()
       << endl;
  arr4.shrink_to_fit();
  cout << "arr4 capacity: " << arr4.capacity() << " size: " << arr4.size()
       << endl;

  return EXIT_SUCCESS;
}

Producción :

1, 12, 45, 134, 424,
41, 32, 15, 14, 99,
arr4 capacity: 5 size: 5
arr4 capacity: 10240 size: 10005
arr4 capacity: 10005 size: 10005
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