Contenitore vettoriale in C++ STL

Jinku Hu 12 ottobre 2023
  1. Usa std::vector per costruire un array dinamico in C++
  2. Usa std::vector per memorizzare gli oggetti struct in C++
  3. Usa la funzione std::vector::swap per scambiare elementi vettoriali in C++
Contenitore vettoriale in C++ STL

Questo articolo introdurrà diversi metodi su come utilizzare un contenitore vettore in C++.

Usa std::vector per costruire un array dinamico in C++

std::vector fa parte della libreria dei contenitori e implementa un array ridimensionabile dinamicamente che memorizza gli elementi in un archivio contiguo. Gli elementi vector vengono solitamente aggiunti alla fine con le funzioni integrate push_back o emplace_back. Il contenitore vector può essere facilmente costruito con la lista degli inizializzatori come mostrato nel seguente codice di esempio - oggetto arr. Inoltre, è possibile memorizzare i valori della lista di inizializzatori statici nell’espressione macro ed esprimere in modo conciso l’operazione di inizializzazione quando necessario.

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

Usa std::vector per memorizzare gli oggetti struct in C++

std::vector può essere utilizzato per memorizzare strutture definite dall’utente e inizializzarle con la notazione della lista contro parentesi simile all’esempio precedente. Notare che, quando si aggiunge un nuovo elemento struct usando la funzione push_back, il valore dovrebbe essere passato come una lista di controventi, e se ci sono più strutture annidate all’interno di una struct, dovrebbe essere usata la notazione corrispondente.

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

Usa la funzione std::vector::swap per scambiare elementi vettoriali in C++

std::vector fornisce molteplici funzioni integrate per operare sui suoi elementi, una delle quali è swap. Può essere chiamato dall’oggetto vector e prendere un altro vector come argomento per scambiarne il contenuto. Un’altra funzione utile è size, che recupera il conteggio degli elementi correnti nell’oggetto vector dato. Nota però, esiste una funzione simile chiamata capacity che restituisce il numero di elementi memorizzati nel buffer attualmente allocato. Quest’ultimo a volte viene allocato di dimensioni maggiori per evitare chiamate non essenziali ai servizi del sistema operativo. Il codice di esempio seguente mostra lo scenario in cui le due funzioni restituiscono valori diversi.

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

Produzione:

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