Conteneur vectoriel en C++ STL

Jinku Hu 12 octobre 2023
  1. Utilisez std::vector pour construire un tableau dynamique en C++
  2. Utilisez std::vector pour stocker les objets struct en C++
  3. Utilisez la fonction std::vector::swap pour permuter les éléments vectoriels en C++
Conteneur vectoriel en C++ STL

Cet article présentera plusieurs méthodes d’utilisation d’un conteneur vector en C++.

Utilisez std::vector pour construire un tableau dynamique en C++

std::vector fait partie de la bibliothèque de conteneurs et implémente un tableau redimensionnable dynamiquement qui stocke les éléments dans un stockage contigu. Les éléments vector sont généralement ajoutés à la fin avec les fonctions intégrées push_back ou emplace_back. Le conteneur vector peut être facilement construit avec la liste d’initialisation comme indiqué dans l’exemple de code suivant - objet arr. En outre, on peut stocker des valeurs de liste d’initialiseurs statiques dans l’expression de macro et exprimer de manière concise l’opération d’initialisation si nécessaire.

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

Utilisez std::vector pour stocker les objets struct en C++

std::vector peut être utilisé pour stocker des structures personnalisées et les initialiser avec la notation de liste accolée similaire à l’exemple précédent. Notez que, lors de l’ajout d’un nouvel élément struct à l’aide de la fonction push_back, la valeur doit être passée sous forme de liste entretoise, et s’il y a plusieurs structures imbriquées dans une struct, la notation correspondante doit être utilisée.

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

Utilisez la fonction std::vector::swap pour permuter les éléments vectoriels en C++

std::vector fournit plusieurs fonctions intégrées pour opérer sur ses éléments, dont l’une est swap. Il peut être appelé à partir de l’objet vector et prendre un autre vector comme argument pour permuter leur contenu. Une autre fonction utile est size, qui récupère le nombre d’éléments courant dans l’objet vector donné. Notez cependant qu’il existe une fonction similaire appelée capacity qui renvoie le nombre d’éléments stockés dans la mémoire tampon actuellement allouée. Cette dernière est parfois allouée de plus grande taille pour éviter les appels inutiles aux services du système d’exploitation. L’exemple de code suivant illustre le scénario dans lequel les deux fonctions renvoient des valeurs différentes.

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

Production:

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

Article connexe - C++ Vector