std::basic_string
| Défini dans l'en-tête <string>
|
||
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
|
(1) | |
namespace pmr {
template<
class CharT,
class Traits = std::char_traits<CharT>
> using basic_string =
std::basic_string<CharT, Traits, std::pmr::polymorphic_allocator<CharT>>;
}
|
(2) | (depuis C++17) |
Le modèle de classe basic_string stocke et manipule des séquences d'objets de type caractère, qui sont des objets non-tableaux de type TrivialType et StandardLayoutType. La classe ne dépend ni du type de caractère ni de la nature des opérations sur ce type. Les définitions des opérations sont fournies via le paramètre de modèle Traits - une spécialisation de std::char_traits ou une classe de traits compatible.
Les éléments d'un basic_string sont stockés de manière contiguë, c'est-à-dire que pour un basic_string s, &*(s.begin() + n) == &*s.begin() + n pour tout n dans [0, s.size()), et *(s.begin() + s.size()) a la valeur CharT() (un terminateur nul)(depuis C++11); ou, de manière équivalente, un pointeur vers s[0] peut être passé à des fonctions qui attendent un pointeur vers le premier élément de un tableau(jusqu'à C++11)un tableau terminé par un nul(depuis C++11) de CharT.
std::basic_string satisfait aux exigences de AllocatorAwareContainer (sauf que les versions personnalisées construct/destroy ne sont pas utilisées pour la construction/destruction d'éléments), SequenceContainer et ContiguousContainer(depuis C++17).
Si l'un de Traits::char_type et Allocator::char_type est différent de CharT, le programme est mal formé.
|
Toutes les fonctions membres de
Cependant, définir une variable |
(depuis C++20) |
Plusieurs typedefs pour les types de caractères courants sont fournis :
Défini dans l'en-tête
<string> | |
| Type | Définition |
std::string
|
std::basic_string<char>
|
std::wstring
|
std::basic_string<wchar_t>
|
std::u8string (C++20)
|
std::basic_string<char8_t>
|
std::u16string (C++11)
|
std::basic_string<char16_t>
|
std::u32string (C++11)
|
std::basic_string<char32_t>
|
std::pmr::string (C++17)
|
std::pmr::basic_string<char>
|
std::pmr::wstring (C++17)
|
std::pmr::basic_string<wchar_t>
|
std::pmr::u8string (C++20)
|
std::pmr::basic_string<char8_t>
|
std::pmr::u16string (C++17)
|
std::pmr::basic_string<char16_t>
|
std::pmr::u32string (C++17)
|
std::pmr::basic_string<char32_t>
|
Paramètres du modèle
| CharT | - | type de caractère |
| Traits | - | classe de traits spécifiant les opérations sur le type de caractère |
| Allocator | - | Allocator type utilisé pour allouer le stockage interne |
Types imbriqués
| Type | Définition | ||||
traits_type
|
Traits
|
||||
value_type
|
CharT
|
||||
allocator_type
|
Allocator
|
||||
size_type
|
|
||||
difference_type
|
|
||||
reference
|
value_type & | ||||
const_reference
|
const value_type & | ||||
pointer
|
|
||||
const_pointer
|
|
||||
iterator
|
|
||||
const_iterator
|
|
||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > |
Membres de données
constexpr
size_type
npos
[static]
|
la valeur spéciale size_type ( - 1 ) , sa signification exacte dépend du contexte |
Fonctions membres
construit une
basic_string
(fonction membre publique) |
|
|
détruit la chaîne, désallouant le stockage interne si utilisé
(fonction membre publique) |
|
|
assigne des valeurs à la chaîne
(fonction membre publique) |
|
|
assigner des caractères à une chaîne
(fonction membre publique) |
|
|
(C++23)
|
assigne une plage de caractères à une chaîne
(fonction membre publique) |
|
retourne l'allocateur associé
(fonction membre publique) |
|
Accès aux éléments |
|
|
accède au caractère spécifié avec vérification des limites
(fonction membre publique) |
|
|
accède au caractère spécifié
(fonction membre publique) |
|
|
(
DR*
)
|
accède au premier caractère
(fonction membre publique) |
|
(
DR*
)
|
accède au dernier caractère
(fonction membre publique) |
|
retourne un pointeur vers le premier caractère d'une chaîne
(fonction membre publique) |
|
|
retourne une version non modifiable du tableau de caractères C standard de la chaîne
(fonction membre publique) |
|
|
(C++17)
|
retourne une
basic_string_view
non modifiable de la chaîne entière
(fonction membre publique) |
Itérateurs |
|
|
(C++11)
|
retourne un itérateur vers le début
(fonction membre publique) |
|
(C++11)
|
retourne un itérateur vers la fin
(fonction membre publique) |
|
(C++11)
|
retourne un itérateur inverse vers le début
(fonction membre publique) |
|
(C++11)
|
retourne un itérateur inverse vers la fin
(fonction membre publique) |
Capacité |
|
|
vérifie si la chaîne est vide
(fonction membre publique) |
|
|
retourne le nombre de caractères
(fonction membre publique) |
|
|
retourne le nombre maximum de caractères
(fonction membre publique) |
|
|
réserve de l'espace de stockage
(fonction membre publique) |
|
|
retourne le nombre de caractères pouvant être stockés dans l'espace mémoire actuellement alloué
(fonction membre publique) |
|
|
(
DR*
)
|
réduit l'utilisation de la mémoire en libérant la mémoire inutilisée
(fonction membre publique) |
Modificateurs |
|
|
efface le contenu
(fonction membre publique) |
|
|
insère des caractères
(fonction membre publique) |
|
|
(C++23)
|
insère une plage de caractères
(fonction membre publique) |
|
supprime des caractères
(fonction membre publique) |
|
|
ajoute un caractère à la fin
(fonction membre publique) |
|
|
(
DR*
)
|
supprime le dernier caractère
(fonction membre publique) |
|
ajoute des caractères à la fin
(fonction membre publique) |
|
|
(C++23)
|
ajoute une plage de caractères à la fin
(fonction membre publique) |
|
ajoute des caractères à la fin
(fonction membre publique) |
|
|
remplace la partie spécifiée d'une chaîne
(fonction membre publique) |
|
|
(C++23)
|
remplace la partie spécifiée d'une chaîne par une plage de caractères
(fonction membre publique) |
|
copie des caractères
(fonction membre publique) |
|
|
modifie le nombre de caractères stockés
(fonction membre publique) |
|
|
(C++23)
|
modifie le nombre de caractères stockés et éventuellement remplace le contenu indéterminé via une opération fournie par l'utilisateur
(fonction membre publique) |
|
échange le contenu
(fonction membre publique) |
|
Recherche |
|
|
trouve la première occurrence de la sous-chaîne donnée
(fonction membre publique) |
|
|
trouver la dernière occurrence d'une sous-chaîne
(fonction membre publique) |
|
|
trouver la première occurrence de caractères
(fonction membre publique) |
|
|
trouver la première absence de caractères
(fonction membre publique) |
|
|
trouver la dernière occurrence de caractères
(fonction membre publique) |
|
|
trouver la dernière absence de caractères
(fonction membre publique) |
|
Opérations | |
| compare deux chaînes (fonction membre publique) | |
(C++20) |
vérifie si la chaîne commence par le préfixe donné (fonction membre publique) |
(C++20) |
vérifie si la chaîne se termine par le suffixe donné (fonction membre publique) |
(C++23) |
vérifie si la chaîne contient la sous-chaîne ou le caractère donné (fonction membre publique) |
| renvoie une sous-chaîne (fonction membre publique) | |
(C++26) |
renvoie une sous-vue (fonction membre publique) |
Fonctions non membres
|
concatène deux chaînes, une chaîne et un
char
, ou une chaîne et
string_view
(modèle de fonction) |
|
|
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(supprimé en C++20)
(C++20)
|
compare lexicographiquement deux chaînes
(modèle de fonction) |
|
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) |
|
Entrée/sortie |
|
|
effectue l'entrée et la sortie de flux sur les chaînes
(modèle de fonction) |
|
|
lit les données d'un flux d'E/S dans une chaîne
(modèle de fonction) |
|
Conversions numériques |
|
|
(C++11)
(C++11)
(C++11)
|
convertit une chaîne en entier signé
(fonction) |
|
(C++11)
(C++11)
|
convertit une chaîne en entier non signé
(fonction) |
|
(C++11)
(C++11)
(C++11)
|
convertit une chaîne en valeur à virgule flottante
(fonction) |
|
(C++11)
|
convertit une valeur entière ou à virgule flottante en
string
(fonction) |
|
(C++11)
|
convertit une valeur entière ou à virgule flottante en
wstring
(fonction) |
Littéraux
|
Défini dans l'espace de noms en ligne
std::literals::string_literals
|
|
|
(C++14)
|
convertit un littéral de tableau de caractères en
basic_string
(fonction) |
Classes d'assistance
|
(C++11)
|
prise en charge du hachage pour les chaînes de caractères
(spécialisation de modèle de classe) |
Guides de déduction (depuis C++17)
Invalidation des itérateurs
Les références, pointeurs et itérateurs faisant référence aux éléments d'un
basic_string
peuvent être invalidés par toute fonction de la bibliothèque standard prenant une référence à un
basic_string
non constant comme argument, telles que
std::getline
,
std::swap
, ou
operator>>
, et par l'appel de fonctions membres non constantes, à l'exception de
operator[]
,
at
,
data
,
front
,
back
,
begin
,
rbegin
,
end
, et
rend
.
Notes
Bien qu'il soit requis qu'un
construct
ou
destroy
personnalisé soit utilisé lors de la construction ou de la destruction des éléments de
std::basic_string
jusqu'au C++23, toutes les implémentations n'ont utilisé que le mécanisme par défaut. Cette exigence est corrigée par
P1072R10
pour correspondre à la pratique existante.
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_lib_string_udls
|
201304L
|
(C++14) | Littéraux définis par l'utilisateur pour les types chaîne |
__cpp_lib_starts_ends_with
|
201711L
|
(C++20) |
starts_with
,
ends_with
|
__cpp_lib_constexpr_string
|
201907L
|
(C++20) |
Constexpr pour
std::basic_string
|
__cpp_lib_char8_t
|
201907L
|
(C++20) |
std::u8string
|
__cpp_lib_erase_if
|
202002L
|
(C++20) |
erase
,
erase_if
|
__cpp_lib_string_contains
|
202011L
|
(C++23) |
contains
|
__cpp_lib_string_resize_and_overwrite
|
202110L
|
(C++23) |
resize_and_overwrite
|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | Fonctions membres pour la construction, l'insertion et le remplacement qui acceptent une plage compatible avec le conteneur |
Exemple
#include <iostream> #include <string> int main() { using namespace std::literals; // Création d'une chaîne à partir de const char* std::string str1 = "hello"; // Création d'une chaîne en utilisant un littéral de chaîne auto str2 = "world"s; // Concaténation de chaînes std::string str3 = str1 + " " + str2; // Affichage du résultat std::cout << str3 << '\n'; std::string::size_type pos = str3.find(" "); str1 = str3.substr(pos + 1); // la partie après l'espace str2 = str3.substr(0, pos); // la partie jusqu'à l'espace std::cout << str1 << ' ' << str2 << '\n'; // Accès à un élément en utilisant l'opérateur d'indice [] std::cout << str1[0] << '\n'; str1[0] = 'W'; std::cout << str1 << '\n'; }
Sortie :
hello world world hello w World
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | S'applique à | Comportement publié | Comportement corrigé |
|---|---|---|---|
| LWG 530 | C++98 |
la contiguïté du stockage pour les éléments de
basic_string
a été accidentellement rendue non requise par LWG259 |
à nouveau requise |
| LWG 2861 | C++98 |
value_type
était
Traits::char_type
|
modifié en
CharT
|
|
LWG 2994
( P1148R0 ) |
C++98 |
le comportement est indéfini si l'un des
Traits::char_type
[1]
et
Allocator::char_type
est différent de
CharT
|
le programme est
mal formé dans ce cas |
Voir aussi
|
(C++17)
|
vue de chaîne en lecture seule
(modèle de classe) |
Liens externes
| Gestion des chaînes de caractères en C++ |