std:: inplace_vector
|
Défini dans l'en-tête
<inplace_vector>
|
||
|
template
<
class
T,
|
(depuis C++26) | |
inplace_vector
est un tableau redimensionnable dynamiquement avec un stockage contigu sur place. Les éléments de type
T
sont stockés et correctement alignés dans l'objet lui-même. La capacité du stockage interne est fixée à la compilation et est égale à
N
.
Les éléments sont stockés de manière contiguë, ce qui signifie que les éléments peuvent être accédés non seulement via des itérateurs ou l'opérateur d'accès aléatoire
operator
[
]
, mais aussi en utilisant des décalages vers des pointeurs classiques vers les éléments. Un pointeur vers un élément d'un
inplace_vector
peut être passé à toute fonction qui attend un pointeur vers un élément d'un tableau C.
Le
inplace_vector
modélise
Container
,
ReversibleContainer
,
ContiguousContainer
, et
SequenceContainer
, incluant la plupart des
exigences optionnelles des conteneurs séquentiels
, à l'exception que les fonctions membres
push_front
,
emplace_front
,
pop_front
, et
prepend_range
ne sont pas fournies.
Pour tout
N
positif,
std::inplace_vector<T, N>::iterator
et
std::inplace_vector<T, N>::const_iterator
satisfont aux exigences
ConstexprIterator
.
La spécialisation std :: inplace_vector < T, 0 > est TriviallyCopyable et est vide. std:: is_trivially_default_constructible_v < std :: inplace_vector < T, 0 >> est également true .
Toute fonction membre de std :: inplace_vector < T, N > qui entraînerait une insertion au-delà de la capacité N lance std::bad_alloc .
La complexité des opérations courantes sur les
inplace_vector
s est la suivante :
-
Accès aléatoire à un élément via
operator[]ouat()– constant : 𝓞(1) . - Insertion ou suppression d'un élément à la fin – constant : 𝓞(1) .
- Insertion ou suppression d'éléments à la fin – linéaire dans le nombre d'éléments insérés/supprimés : 𝓞(n) .
- Insertion ou suppression d'éléments au début ou au milieu – linéaire dans le nombre d'éléments insérés/supprimés plus la distance jusqu'à la fin du vecteur : 𝓞(n) .
Table des matières |
Invalidation des itérateurs
std::inplace_vector
Les garanties d'invalidation des itérateurs diffèrent de celles de
std::vector
:
-
déplacer un
inplace_vectorinvalide tous les itérateurs ; -
échanger deux
inplace_vectors invalide tous les itérateurs (pendant l'échange, l'itérateur continuera de pointer vers le même élément du tableau, et peut donc changer de valeur).
Les fonctions membres suivantes peuvent potentiellement invalider les itérateurs :
operator=
,
assign
,
assign_range
,
clear
,
emplace
,
erase
,
insert
,
insert_range
,
pop_back
,
resize
, et
swap
.
Les fonctions membres suivantes invalident potentiellement uniquement l'itérateur
end
:
append_range
,
emplace_back
,
push_back
,
try_append_range
,
try_emplace_back
,
try_push_back
,
unchecked_emplace_back
, et
unchecked_push_back
.
Paramètres du modèle
| T | - | Type d'élément. Doit être MoveConstructible et MoveAssignable . |
| N | - |
Capacité, c'est-à-dire le nombre maximum d'éléments dans le
inplace_vector
(peut être
0
).
|
Types membres
| Type | Définition |
value_type
|
T
|
size_type
|
std::size_t |
difference_type
|
std::ptrdiff_t |
reference
|
value_type & |
const_reference
|
const value_type & |
pointer
|
value_type * |
const_pointer
|
const value_type * |
iterator
|
défini par l'implémentation
LegacyRandomAccessIterator
et
random_access_iterator
vers
value_type
|
const_iterator
|
défini par l'implémentation
LegacyRandomAccessIterator
,
ConstexprIterator
(depuis C++26)
et
random_access_iterator
vers
const
value_type
|
reverse_iterator
|
std:: reverse_iterator < iterator > |
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > |
Fonctions membres
construit le
inplace_vector
(fonction membre publique) |
|
détruit le
inplace_vector
(fonction membre publique) |
|
|
assigne des valeurs au conteneur
(fonction membre publique) |
|
|
assigne des valeurs au conteneur
(fonction membre publique) |
|
|
assigne une plage de valeurs au conteneur
(fonction membre publique) |
|
Accès aux éléments |
|
|
accéder à l'élément spécifié avec vérification des limites
(fonction membre publique) |
|
|
accéder à l'élément spécifié
(fonction membre publique) |
|
|
accéder au premier élément
(fonction membre publique) |
|
|
accéder au dernier élément
(fonction membre publique) |
|
|
accès direct au stockage contigu sous-jacent
(fonction membre publique) |
|
Itérateurs |
|
|
renvoie un itérateur vers le début
(fonction membre publique) |
|
|
retourne un itérateur vers la fin
(fonction membre publique) |
|
|
retourne un itérateur inverse vers le début
(fonction membre publique) |
|
|
retourne un itérateur inverse vers la fin
(fonction membre publique) |
|
Taille et capacité |
|
|
vérifie si le conteneur est vide
(fonction membre publique) |
|
|
retourne le nombre d'éléments
(fonction membre publique) |
|
|
[static]
|
retourne le nombre maximum possible d'éléments
(fonction membre publique statique) |
|
[static]
|
retourne le nombre d'éléments pouvant être contenus dans le stockage actuellement alloué
(fonction membre publique statique) |
|
modifie le nombre d'éléments stockés
(fonction membre publique) |
|
|
[static]
|
réserve le stockage
(fonction membre publique statique) |
|
[static]
|
réduit l'utilisation de la mémoire en libérant la mémoire inutilisée
(fonction membre publique statique) |
Modificateurs |
|
|
insère des éléments
(fonction membre publique) |
|
|
insère une plage d'éléments
(fonction membre publique) |
|
|
construit un élément en place
(fonction membre publique) |
|
|
construit un élément en-place à la fin
(fonction membre publique) |
|
|
tente de construire un élément en-place à la fin
(fonction membre publique) |
|
|
construit inconditionnellement un élément sur place à la fin
(fonction membre publique) |
|
|
ajoute un élément à la fin
(fonction membre publique) |
|
|
tente d'ajouter un élément à la fin
(fonction membre publique) |
|
|
ajoute inconditionnellement un élément à la fin
(fonction membre publique) |
|
|
supprime le dernier élément
(fonction membre publique) |
|
|
ajoute une plage d'éléments à la fin
(fonction membre publique) |
|
|
tente d'ajouter une plage d'éléments à la fin
(fonction membre publique) |
|
|
efface le contenu
(fonction membre publique) |
|
|
efface les éléments
(fonction membre publique) |
|
|
échange le contenu
(fonction membre publique) |
|
Fonctions non membres
|
(C++26)
|
spécialise l'algorithme
std::swap
(modèle de fonction) |
|
efface tous les éléments satisfaisant des critères spécifiques
(modèle de fonction) |
|
|
(C++26)
|
compare lexicographiquement les valeurs de deux
inplace_vector
s
(modèle de fonction) |
Notes
Le nombre d'éléments dans un
inplace_vector
peut varier dynamiquement jusqu'à une capacité fixe car les éléments sont stockés dans l'objet lui-même, de manière similaire à
std::array
. Cependant, les objets sont initialisés lors de leur insertion dans le
inplace_vector
contrairement aux tableaux C ou au
std::array
, qui doivent construire tous les éléments lors de l'instanciation.
inplace_vector
est utile dans les environnements où les allocations de mémoire dynamique sont indésirables.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_inplace_vector
|
202406L
|
(C++26) |
std::inplace_vector
: vecteur redimensionnable dynamiquement avec stockage sur place de capacité fixe
|
__cpp_lib_constexpr_inplace_vector
|
202502L
|
(C++26) |
constexpr
std::inplace_vector
pour les types d'éléments non triviaux
|
Exemple
#include <algorithm> #include <array> #include <cassert> #include <inplace_vector> int main() { std::inplace_vector<int, 4> v1{0, 1, 2}; assert(v1.max_size() == 4); assert(v1.capacity() == 4); assert(v1.size() == 3); assert(std::ranges::equal(v1, std::array{0, 1, 2})); assert(v1[0] == 0); assert(v1.at(0) == 0); assert(v1.front() == 0); assert(*v1.begin() == 0); assert(v1.back() == 2); v1.push_back(3); assert(v1.back() == 3); assert(std::ranges::equal(v1, std::array{0, 1, 2, 3})); v1.resize(3); assert(std::ranges::equal(v1, std::array{0, 1, 2})); assert(v1.try_push_back(3) != nullptr); assert(v1.back() == 3); assert(v1.size() == 4); assert(v1.try_push_back(13) == nullptr); // pas de place assert(v1.back() == 3); assert(v1.size() == 4); v1.clear(); assert(v1.size() == 0); assert(v1.empty()); }
Voir aussi
|
tableau contigu redimensionnable
(modèle de classe) |
|
|
(C++11)
|
tableau contigu fixe en place
(modèle de classe) |
|
file double face
(modèle de classe) |
Liens externes
| 1. |
inplace_vector
— Une implémentation de référence de
P0843R14
(
std::inplace_vector
).
|
| 2. |
static_vector
— Boost.Container implémente le vecteur inplace comme un type autonome avec ses propres garanties.
|
| 3. |
fixed_vector
— EASTL implémente le vecteur inplace via un paramètre de template supplémentaire.
|
| 4. |
small_vector
— Folly implémente également le vecteur inplace via un paramètre de template supplémentaire.
|
| 5. |
stack_alloc
— Les allocateurs personnalisés de Howard Hinnant qui émulent
std::inplace_vector
sur
std::vector
.
|