Conteneurs (Modern C++)
Par défaut, utilisez vecteur comme conteneur séquentiel par défaut dans C++. C'est l'équivalent de List<T> dans d'autres langages.
vector<string> v;
v.push_back( "Geddy Lee" );
Utilisez carte (pas unordered_map) comme conteneur associatif par défaut. Utilisez set, multimap, multiset pour plusieurs cas & dégénérés.
map<string, string> phone_book;
// ...
phone_book["Alex Lifeson"] = "+1 (416) 555-1212";
Lorsque l'optimisation des performances est nécessaire, envisagez l'utilisation :
le type de tableau lorsque l'incorporation est importante, par exemple en tant que membre de classe.
conteneurs associatifs non classés (unordered_map, et autres) : Charge mémoire inférieure de chaque élément (majeure) et recherche de constante (potentiellement majeure, parfois secondaire). Plus difficile à utiliser correctement et efficacement, en raison d'inconvénients et des bords tranchants.
Vecteur trié. (Voir : Algorithmes.)
N'utilisez pas de tableaux C. (Pour les API plus anciennes, utilisez f( vec.data(), vec.size() ); .)
Pour un autre article sur les conteneurs, consultez Conteneurs STL.
Tailles de conteneur
Les tableaux suivants répertorient les tailles de conteneur, en octets, pour les plateformes x86 et x64. (À ces fins, ARM 32 bits est équivalent à x86 à ces fins). Ces tables couvrent le mode release, car le mode debug contient le mécanisme de vérification gourmand en espace et en temps. Les colonnes distinctes sont pour Visual C++ 2008 SP1, où _SECURE_SCL avait pour valeur par défaut 1, et pour Visual C++ 2008 SP1 avec _SECURE_SCL défini manuellement sur 0 pour une vitesse maximale. Visual C++ dans Visual Studio 2010, Visual C++ dans Visual Studio 2012 et Visual C++ dans Visual Studio 2013 ont par défaut _SECURE_SCL la valeur 0 (maintenant appelée _ITERATOR_DEBUG_LEVEL).
Tailles de conteneur x86 (octets) |
VC9 SP1 |
VC9 SP1 SCL=0 |
VC10 |
VC11 |
---|---|---|---|---|
vector<int> |
24 |
16 |
16 |
12 |
array<int, 5> |
20 |
20 |
20 |
20 |
deque<int> |
32 |
32 |
24 |
20 |
forward_list<int> |
N/A |
N/A |
8 |
4 |
list<int> |
28 |
12 |
12 |
8 |
priority_queue<int> |
28 |
20 |
20 |
16 |
queue<int> |
32 |
32 |
24 |
20 |
stack<int> |
32 |
32 |
24 |
20 |
pair<int, int> |
8 |
8 |
8 |
8 |
tuple<int, int, int> |
16 |
16 |
16 |
12 |
map<int, int> |
32 |
12 |
16 |
8 |
multimap<int, int> |
32 |
12 |
16 |
8 |
set<int> |
32 |
12 |
16 |
8 |
multiset<int> |
32 |
12 |
16 |
8 |
hash_map<int, int> |
72 |
44 |
44 |
32 |
hash_multimap<int, int> |
72 |
44 |
44 |
32 |
hash_set<int> |
72 |
44 |
44 |
32 |
hash_multiset<int> |
72 |
44 |
44 |
32 |
unordered_map<int, int> |
72 |
44 |
44 |
32 |
unordered_multimap<int, int> |
72 |
44 |
44 |
32 |
unordered_set<int> |
72 |
44 |
44 |
32 |
unordered_multiset<int> |
72 |
44 |
44 |
32 |
string |
28 |
28 |
28 |
24 |
wstring |
28 |
28 |
28 |
24 |
Tailles de conteneur x64 (octets) |
VC9 SP1 |
VC9 SP1 SCL=0 |
VC10 |
VC11 |
---|---|---|---|---|
vector<int> |
48 |
32 |
32 |
24 |
array<int, 5> |
20 |
20 |
20 |
20 |
deque<int> |
64 |
64 |
48 |
40 |
forward_list<int> |
N/A |
N/A |
16 |
8 |
list<int> |
56 |
24 |
24 |
16 |
priority_queue<int> |
56 |
40 |
40 |
32 |
queue<int> |
64 |
64 |
48 |
40 |
stack<int> |
64 |
64 |
48 |
40 |
pair<int, int> |
8 |
8 |
8 |
8 |
tuple<int, int, int> |
16 |
16 |
16 |
12 |
map<int, int> |
64 |
24 |
32 |
16 |
multimap<int, int> |
64 |
24 |
32 |
16 |
set<int> |
64 |
24 |
32 |
16 |
multiset<int> |
64 |
24 |
32 |
16 |
hash_map<int, int> |
144 |
88 |
88 |
64 |
hash_multimap<int, int> |
144 |
88 |
88 |
64 |
hash_set<int> |
144 |
88 |
88 |
64 |
hash_multiset<int> |
144 |
88 |
88 |
64 |
unordered_map<int, int> |
144 |
88 |
88 |
64 |
unordered_multimap<int, int> |
144 |
88 |
88 |
64 |
unordered_set<int> |
144 |
88 |
88 |
64 |
unordered_multiset<int> |
144 |
88 |
88 |
64 |
string |
40 |
40 |
40 |
32 |
wstring |
40 |
40 |
40 |
32 |