Outils pour utilisateurs

Outils du site


lang:cpp:container

Spécificités

Différence entre les conteneurs

Conteneur Mémoire contiguë
vector Oui
array Oui
deque Non
list Non
forward_list Non
stack Non
queue Non
priority_queue Dépend

Choosing the Right Container: Sequential Containers Archive du 09/09/2019 le 13/11/2019

std::set

Les itérateurs begin et end renvoient un type const. std::set est ordonné et sa clé est stockée dans un arbre de type red-black.

C++ std::set update is tedious: I can't change an element in place Archive du 07/02/2010 le 02/01/2020

set::vector

Il y a un cas particulier pour std::vector<bool>. La mémoire est optimisée donc un octet peut stocker 8 bits. Ce qui fait que l'accès à la propriété data() est bloquée. Si cette optimisation n'est pas souhaitée, il faut utiliser un std::vector<unsigned char>.

Autres implémentations

Map et set : https://github.com/martinus/unordered_dense. Tout est stocké dans un std::vector.

Manipulation des données

std::array

  • std::array to std::string
std::string str(std::begin(arr), std::end(arr));
  • std::string to std::array
std::string toto("tototototototo1234");
std::array<char, 16> arr{};
std::copy_n(toto.begin(), std::min(toto.length(), static_cast<size_t>(16)), arr.data());

Interopérabilité

Comparaison de containers

#include <utility>
 
std::vector<int> v1 = std::vector<int>{ 1, 2, 3, 4, 5 };
std::set<int> s2 = std::set<int>{ 2, 3, 4, 5, 6 };
 
bool v1smaller = std::lexicographical_compare(v1.begin(), v1.begin(), s2.begin(), s2.end());

Spécificités

std::vector

  • Constructeur taille / valeur

Ne pas utiliser le constructeur avec {} si on souhaite utiliser celui (taille, valeur_par_defaut).

Ou sinon, il faut expliciter tout le constructeur sans passer par les valeurs par défaut : {15,0,std::allocator<int>()}. Ainsi, il comprendra qu'il faut utiliser le constructeur et non l'initialisation par liste.

Allocate vector size with list initialization (curly braces) Archive du 29/11/2018 le 23/12/2022

Héritage

Il n'est pas possible de faire un conteneur pour une classe de base. Il faut alors stocker uniquement le pointeur (intelligent ou brut).

#include <iostream>
#include <memory>
#include <vector>
 
class Base {
 public:
  virtual void identify() { std::cout << "BASE\n"; }
};
 
class Derived : public Base {
 public:
  virtual void identify() { std::cout << "DERIVED\n"; }
};
 
int main() {
  std::vector<std::unique_ptr<Base>> vect;
  vect.push_back(std::make_unique<Derived>());
 
  vect[0]->identify();
  return 0;
}

Store derived class objects in base class variables Archive du 08/01/2012 le 27/02/2023

lang/cpp/container.txt · Dernière modification : 2023/11/02 10:00 de root