Namespaces
Variants

std::basic_string<CharT,Traits,Allocator>::basic_string

Depuis fr.cppreference.net
 
 
 
std::basic_string
 
basic_string() : basic_string(Allocator()) {}
(1) (depuis C++11)
(jusqu'à C++17)
basic_string() noexcept(noexcept(Allocator()))
    : basic_string(Allocator()) {}
(depuis C++17)
(constexpr depuis C++20)
explicit basic_string( const Allocator& alloc = Allocator() );
(2) (jusqu'à C++11)
explicit basic_string( const Allocator& alloc );
(depuis C++11)
(noexcept depuis C++17)
(constexpr depuis C++20)
basic_string( size_type count, CharT ch,
              const Allocator& alloc = Allocator() );
(3) (constexpr depuis C++20)
template< class InputIt >
basic_string( InputIt first, InputIt last,
              const Allocator& alloc = Allocator() );
(4) (constexpr depuis C++20)
template< container-compatible-range<CharT> R >
constexpr basic_string( std::from_range_t, R&& rg,
                        const Allocator& = Allocator());
(5) (depuis C++23)
basic_string( const CharT* s, size_type count,
              const Allocator& alloc = Allocator() );
(6) (constexpr depuis C++20)
basic_string( const CharT* s, const Allocator& alloc = Allocator() );
(7) (constexpr depuis C++20)
basic_string( std::nullptr_t ) = delete;
(8) (depuis C++23)
template< class StringViewLike >
explicit basic_string( const StringViewLike& t,
                       const Allocator& alloc = Allocator() );
(9) (depuis C++17)
(constexpr depuis C++20)
template< class StringViewLike >
basic_string( const StringViewLike& t,
              size_type pos, size_type count,
              const Allocator& alloc = Allocator() );
(10) (depuis C++17)
basic_string( const basic_string& other );
(11) (constexpr depuis C++20)
basic_string( basic_string&& other ) noexcept;
(12) (depuis C++11)
(constexpr depuis C++20)
basic_string( const basic_string& other, const Allocator& alloc );
(13) (depuis C++11)
(constexpr depuis C++20)
basic_string( basic_string&& other, const Allocator& alloc );
(14) (depuis C++11)
(constexpr depuis C++20)
basic_string( const basic_string& other, size_type pos,
              const Allocator& alloc = Allocator() );
(15) (constexpr depuis C++20)
constexpr basic_string( basic_string&& other, size_type pos,
                        const Allocator& alloc = Allocator() );
(16) (depuis C++23)
basic_string( const basic_string& other,
              size_type pos, size_type count,
              const Allocator& alloc = Allocator() );
(17) (constexpr depuis C++20)
constexpr basic_string( basic_string&& other,
                        size_type pos, size_type count,
                        const Allocator& alloc = Allocator() );
(18) (depuis C++23)
basic_string( std::initializer_list<CharT> ilist,
              const Allocator& alloc = Allocator() );
(19) (depuis C++11)
(constexpr depuis C++20)

Construit une nouvelle chaîne à partir d'une variété de sources de données et éventuellement en utilisant un allocateur fourni par l'utilisateur alloc.

1) Le constructeur par défaut depuis C++11. Construit une chaîne vide avec un allocateur construit par défaut.
Si Allocator n'est pas DefaultConstructible, le comportement est indéfini.
2) Le constructeur par défaut jusqu'à C++11. Construit une chaîne vide avec l'allocateur donné alloc.
3) Construit une chaîne avec count copies du caractère ch.

Si CharT n'est pas CopyInsertable dans std::basic_string<CharT>, le comportement est indéfini.

(depuis C++11)

Cette surcharge participe à la résolution de surcharge seulement si Allocator satisfait aux exigences de Allocator.

(depuis C++17)
4) Construit une chaîne avec le contenu de la plage [first, last). Chaque itérateur dans [first, last) est déréférencé exactement une fois.

Si InputIt ne satisfait pas aux exigences de LegacyInputIterator, la surcharge (3) est appelée à la place avec les arguments static_cast<size_type>(first), last et alloc.

(jusqu'à C++11)

Cette surcharge participe à la résolution de surcharge seulement si InputIt satisfait aux exigences de LegacyInputIterator.

Si CharT n'est pas EmplaceConstructible dans std::basic_string<CharT> à partir de *first, le comportement est indéfini.

(depuis C++11)
5) Construit une chaîne avec le contenu de la plage rg. Chaque itérateur dans rg est déréférencé exactement une fois.
Si CharT n'est pas EmplaceConstructible dans std::basic_string<CharT> à partir de *ranges::begin(rg), le comportement est indéfini.
6) Construit une chaîne avec le contenu de la plage [s, s + count).
Si [s, s + count) n'est pas une plage valide, le comportement est indéfini.
7) Équivalent à basic_string(s, Traits::length(s), alloc).

Cette surcharge participe à la résolution de surcharge seulement si Allocator satisfait aux exigences de Allocator.

(depuis C++17)
8) std::basic_string ne peut pas être construit à partir de nullptr.
9) Convertit implicitement t en une vue de chaîne sv comme par std::basic_string_view<CharT, Traits> sv = t;, puis construit une chaîne comme par basic_string(sv.data(), sv.size(), alloc).
Cette surcharge participe à la résolution de surcharge seulement si std::is_convertible_v<const StringViewLike&,
std::basic_string_view<CharT, Traits>>
est true et std::is_convertible_v<const StringViewLike&, const CharT*> est false.
10) Convertit implicitement t en une vue de chaîne sv comme par std::basic_string_view<CharT, Traits> sv = t;, puis construit une chaîne comme par basic_string(sv.substr(pos, n), alloc).
Cette surcharge participe à la résolution de surcharge seulement si std::is_convertible_v<const StringViewLike&,
std::basic_string_view<CharT, Traits>>
est true.
11-18) Construit une chaîne avec (une partie du) contenu de other. Si le type de other est basic_string&&, lorsque la construction se termine, other est dans un état valide mais non spécifié.
11) Le constructeur de copie.

L'allocateur est obtenu comme en appelant std::allocator_traits<Allocator>::
select_on_container_copy_construction
(other.get_allocator())
.

(depuis C++11)
12) Le constructeur de déplacement. L'allocateur est obtenu par construction de déplacement à partir de other.get_allocator().
13) Identique au constructeur de copie, sauf que alloc est utilisé comme allocateur.
Si CharT n'est pas CopyInsertable dans std::basic_string<CharT>, le comportement est indéfini.
14) Identique au constructeur de déplacement, sauf que alloc est utilisé comme allocateur.
Si CharT n'est pas MoveInsertable dans std::basic_string<CharT>, le comportement est indéfini.
15,16) Construit une chaîne avec le contenu de la plage [other.data() + pos, other.data() + other.size()).
17,18) Construit une chaîne avec le contenu de la plage [other.data() + pos, other.data() + (pos + std::min(count, other.size() - pos))).
19) Équivalent à basic_string(ilist.begin(), ilist.end()).

Paramètres

alloc - allocateur à utiliser pour toutes les allocations mémoire de cette chaîne
count - taille de la chaîne résultante
ch - valeur pour initialiser la chaîne
pos - position du premier caractère à inclure
first, last - plage depuis laquelle copier les caractères
s - pointeur vers un tableau de caractères à utiliser comme source pour initialiser la chaîne
other - autre chaîne à utiliser comme source pour initialiser la chaîne
ilist - std::initializer_list pour initialiser la chaîne
t - objet (convertible en std::basic_string_view ) pour initialiser la chaîne
rg - une plage compatible avec les conteneurs

Complexité

1,2) Constant.
3-7) Linéaire par rapport à la taille de la chaîne.
9-11) Linéaire par rapport à la taille de la chaîne.
12) Constante.
13) Linéaire par rapport à la taille de la chaîne.
14) Linéaire dans la taille de la chaîne si alloc ! = other. get_allocator ( ) est true , sinon constant.
15-19) Linéaire par rapport à la taille de la chaîne.

Exceptions

10) std::out_of_range si pos est hors limites.
14) Ne lance rien si alloc == str. get_allocator ( ) est true .
15-18) std::out_of_range si pos > other. size ( ) est true .

Lance std::length_error si la longueur de la chaîne construite dépasse max_size() (par exemple, si count > max_size ( ) pour (3) ). Les appels à Allocator::allocate peuvent lancer des exceptions.

Si une exception est levée pour quelque raison que ce soit, ces fonctions n'ont aucun effet ( strong exception safety guarantee ).

Notes

Initialisation avec un littéral de chaîne qui contient des caractères ' \0 ' intégrés utilise la surcharge (7) , qui s'arrête au premier caractère nul. Ceci peut être évité en spécifiant un constructeur différent ou en utilisant operator""s :

std::string s1 = "ab\0\0cd";   // s1 contient "ab"
std::string s2{"ab\0\0cd", 6}; // s2 contient "ab\0\0cd"
std::string s3 = "ab\0\0cd"s;  // s3 contient "ab\0\0cd"
Macro de test de fonctionnalité Valeur Std Fonctionnalité
__cpp_lib_containers_ranges 202202L (C++23) Constructeur étiqueté (5) pour construire à partir d'un intervalle compatible avec le conteneur

Exemple

#include <cassert>
#include <cctype>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <string>
int main()
{
    std::cout << "1)  string(); ";
    std::string s1;
    assert(s1.empty() && (s1.length() == 0) && (s1.size() == 0));
    std::cout << "s1.capacity(): " << s1.capacity() << '\n'; // non spécifié
    std::cout << "3)  string(size_type count, CharT ch): ";
    std::string s2(4, '=');
    std::cout << std::quoted(s2) << '\n'; // "===="
    std::cout << "4)  string(InputIt first, InputIt last): ";
    char mutable_c_str[] = "another C-style string";
    std::string s4(std::begin(mutable_c_str) + 8, std::end(mutable_c_str) - 1);
    std::cout << std::quoted(s4) << '\n'; // "C-style string"
    std::cout << "6)  string(CharT const* s, size_type count): ";
    std::string s6("Chaîne de style C", 7);
    std::cout << std::quoted(s6) << '\n'; // Style C, c'est-à-dire [0, 7)
    std::cout << "7)  string(CharT const* s): ";
    std::string s7("Chaîne de style C\0");
    std::cout << std::quoted(s7) << '\n'; // "Style C"
    std::cout << "11) string(string&): ";
    std::string const other11("Exemplaire");
    std::string s11(other11);
    std::cout << std::quoted(s11) << '\n'; // "Exemplaire"
    std::cout << "12) string(string&&): ";
    std::string s12(std::string("C++ par ") + std::string("exemple"));
    std::cout << std::quoted(s12) << '\n'; // "C++ par l'exemple"
    std::cout << "15) string(const string& other, size_type pos): ";
    std::string const other15("Mutatis Mutandis");
    std::string s15(other15, 8);
    std::cout << std::quoted(s15) << '\n'; // "Mutandis", c'est-à-dire [8, 16)
    std::cout << "17) string(const string& other, size_type pos, size_type count): ";
    std::string const other17("Exemplaire");
    std::string s17(other17, 0, other17.length() - 1);
    std::cout << std::quoted(s17) << '\n'; // "Exemplaire"
    std::cout << "19) string(std::initializer_list<CharT>): ";
    std::string s19({'C', '-', 's', 't', 'y', 'l', 'e'});
    std::cout << std::quoted(s19) << '\n'; // "Style C"
}

Sortie possible :

1)  string(); s1.capacity(): 15
3)  string(size_type count, CharT ch): "===="
4)  string(InputIt first, InputIt last): "C-style string"
6)  string(CharT const* s, size_type count): "C-style"
7)  string(CharT const* s): "C-style"
11) string(string&): "Exemplar"
12) string(string&&): "C++ by example"
15) string(const string& other, size_type pos): "Mutandis"
17) string(const string& other, size_type pos, size_type count): "Exemplar"
19) string(std::initializer_list<CharT>): "C-style"

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 Appliqué à Comportement publié Comportement corrigé
LWG 301 C++98 la surcharge (4) n'utilisait pas le paramètre
alloc si InputIt est un type entier
utilise ce paramètre
LWG 438 C++98 la surcharge (4) n'appelait la surcharge (3)
que si InputIt est un type entier
appelle la surcharge (3) si InputIt
n'est pas un LegacyInputIterator
LWG 847 C++98 aucune garantie de sûreté des exceptions garantie de sûreté forte des exceptions ajoutée
LWG 2193 C++11 le constructeur par défaut est explicite rendu non-explicite
LWG 2235 C++98 s pouvait être une valeur de pointeur nul le comportement est indéfini dans ce cas
LWG 2250 C++98 le comportement de la surcharge (17) était indéfini
si pos > other. size ( ) est true
lève toujours une
exception dans ce cas
LWG 2583 C++98 aucun moyen de fournir un allocateur pour la surcharge (17) surcharge (15) ajoutée
LWG 2946 C++17 la surcharge (9) provoque une ambiguïté dans certains cas évitée en la rendant template
LWG 3076 C++17 les surcharges (3,7) peuvent provoquer des ambiguïtés
dans la déduction d'arguments de template de classe
contraintes ajoutées
LWG 3111
( P1148R0 )
C++98 la résolution de LWG issue 2235 a rendu
le comportement de basic_string ( nullptr, 0 ) indéfini
le comportement est bien
défini dans ce cas [1]
  1. ↑ [ nullptr , nullptr + 0 ) constitue une plage vide valide, car l'ajout de zéro à une valeur de pointeur nul est également bien défini (le résultat reste une valeur de pointeur nul).

Voir aussi

assigner des caractères à une chaîne
(fonction membre publique)
assigne des valeurs à la chaîne
(fonction membre publique)
(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)
construit un basic_string_view
(fonction membre publique de std::basic_string_view<CharT,Traits> )