Namespaces
Variants

std:: inplace_vector

From cppreference.net
Défini dans l'en-tête <inplace_vector>
template <

class T,
std:: size_t N

> struct inplace_vector ;
(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[] ou at() – 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_vector invalide tous les itérateurs ;
  • échanger deux inplace_vector s 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)
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

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)
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 .