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
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
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>
.
Map et set : https://github.com/martinus/unordered_dense. Tout est stocké dans un std::vector
.
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());
#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());
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
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