std::inplace_vector
| Défini dans l'en-tête <inplace_vector>
|
||
template<
class T,
std::size_t N
> struct inplace_vector;
|
(depuis C++26) | |
std::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 qu'ils peuvent être accédés non seulement via des itérateurs ou un accès aléatoire operator[], mais aussi en utilisant des décalages sur des pointeurs ordinaires 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.
std::inplace_vector satisfait aux exigences de Container, ReversibleContainer, ContiguousContainer et SequenceContainer, y compris la plupart des exigences optionnelles pour les conteneurs séquentiels, sauf que les fonctions membres push_front, emplace_front, pop_front et prepend_range ne sont pas fournies.
Pour tout N, std::inplace_vector<T, N>::iterator et std::inplace_vector<T, N>::const_iterator satisfont aux exigences de 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 provoquerait une insertion au-delà de la capacité N lève std::bad_alloc.
La complexité des opérations courantes sur les inplace_vector 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 en fonction du nombre d'éléments insérés/supprimés : 𝓞(n).
- Insertion ou suppression d'éléments au début ou au milieu – linéaire en fonction du nombre d'éléments insérés/supprimés plus la distance jusqu'à la fin du vecteur : 𝓞(n).
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 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, similaire à std::array. Cependant, les objets sont initialisés lorsqu'ils sont insérés dans inplace_vector contrairement aux tableaux C ou std::array, qui doivent construire tous les éléments lors de l'instanciation.
inplace_vector est utile dans les environnements où les allocations mémoire dynamiques ne sont pas souhaitées.
| Test de fonctionnalité macro | Valeur | Norme | Fonctionnalité |
|---|---|---|---|
__cpp_lib_inplace_vector |
202406L |
(C++26) | std::inplace_vector: vecteur redimensionnable dynamiquement avec stockage sur place à capacité fixe
|
202603L |
(C++26) | Meilleur type de retour pour try_push_back() et try_emplace_back(). Supprimé try_append_range()
| |
__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>
#include <optional>
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) != std::nullopt);
assert(v1.back() == 3);
assert(v1.size() == 4);
assert(v1.try_push_back(13) == std::nullopt); // no 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
.
|