Contenitore vettoriale in C++ STL
-
Usa
std::vector
per costruire un array dinamico in C++ -
Usa
std::vector
per memorizzare gli oggettistruct
in C++ -
Usa la funzione
std::vector::swap
per scambiare elementi vettoriali in C++
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
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