Namespaces
Variants

std::inplace_vector

De fr.cppreference.net
 
 
 
 
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[] 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 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_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 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, 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 .