Classe string : principales opérations

© D. Mathieu     mathieu@romarin.univ-aix.fr
I.U.T.d'Aix en Provence - Département Informatique
Créé le 13/01/2000 - Dernière mise à jour : 12/01/2001

Sommaire

Fonctions et operateurs membres de la classe string
Constructeurs
Accesseurs de la classe string
Modifieurs de la classe string
Méthodes
append()
assign()
erase()
insert()
replace()
swap()
c_str()
Algorithmes de recherche
Opérateurs
Affectation :  =
Concaténation : +=
Fonctions et opérateurs non membres, utilisables avec des strings
Opérateur de concaténation : +
Opérateurs de comparaison :    ==   !=   <   >   <=   >=
Entrées/Sorties
Divers
Voir aussi


Remarques préliminaire :

Fonctions et opérateurs membres de la classe string

Constructeurs

string ident;

string ident ("..." );
string ident ("...", Nbre); 

string ident (S);
string ident (S, Pos);
string ident (S, Pos, Nbre);

string ident (Nbre, C);

"..."  : de type NTCTS
Pos, Nbre  : des entiers non signés (en principe de type string::size_type)
S  : de type string
C  : caractère (type "générique" charT)
Remarques :
  1. Le premier constructeur est appelé le constructeur par défaut (parce qu'utilisé sans paramètre).
  2. Le quatrième constructeur est appelé le constructeur par recopie (parce qu'il recopie un string dans un autre).
  3. Il appartient à l'utilisateur de s'assurer que Pos et Nbre sont valides.
Exemples :
 
                                                  // Affichage :
string S01;
cout << '#" << S01 << '#' << endl;                // ##

string S02 ("ABCDE");
cout << '#" << S02 << '#' << endl;                // #ABCDE#

string S03 ("ABCDE", /* Nbre = */ 3);
cout << '#" << S03 << '#' << endl;                // #ABC#

string S04 ("ABCDE", /* Nbre = */ 6);
cout << '#" << S04 << '#' << endl;                // #ABCDE#   {1}

string S05 (S02);
cout << '#" << S05 << '#' << endl;                // #ABCDE#

string S06 (S02, /* Pos = */ 2);
cout << '#" << S06 << '#' << endl;                // #CDE#

string S07 (S02, /* Pos = */ 5);
cout << '#" << S07 << '#' << endl;                // ##        {2}

string S08 (S02, /* Pos = */ 2, /* Nbre = */ 2);
cout << '#" << S08 << '#' << endl;                // #CD#

string S09 (S02, /* Pos = */ 2, /* Nbre = */ 0);
cout << '#" << S09 << '#' << endl;                // ##        {3}

string S10 (S02, /* Pos = */ 2, /* Nbre = */ 10);
cout << '#" << S10 << '#' << endl;                // #CDE#     {1}

Remarques :.

  1. Nbre indique le nombre maximal de caractères qui doivent être extraits du premier paramètre.
  2. Bien que la première position dans la chaîne corresponde à Pos = 0, la valeur Pos = 5 n'est pas invalide. Elle représente la première position après la fin de la chaîne (valeur dite "past-the-end"). La chaîne extraite est alors une chaîne vide. En revanche toute valeur Pos > 5 est invalide.
  3. Si Nbre == 0, le nombre d'octets extraits est nul, ce qui crée une chaîne vide.
Sommaire

Accesseurs de la classe string

ident.size     ()
ident.length   ()
ident.max_size ()
ident.capacity ()

ident.empty ()

    Toutes les fonctions renvoient une valeur de type string::size_type (en pratique un entier non signé) sauf empty() qui renvoie un booléen.

Exemples :
 
                                          // Affichage
string S01 ("ABCDE");
string::size_type Size = S01.size ();
cout << Size            << endl;          // 5

cout << S01.size     () << endl;          // 5
cout << S01.length   () << endl;          // 5
cout << S01.max_size () << endl;          // xxxxxxxxxxxx  dépend de l'implémentation
cout << S01.capacity () << endl;          // 8             dépend de l'implémentation

if (S01.empty ()) ...

    La capacité d'une chaîne vide (par ex. constructeur par défaut) est indéfinie

Sommaire

Modifieurs de la classe string

    Ces fonctions ne renvoient rien.
 
ident.resize  (Nbre, C);
ident.resize  (Nbre);

ident.clear   (void);     // non implémenté ici

ident.reserve (Nbre = 0); // implémenté ici mais vide

    Nbre doit être de type string::size_type

Exemples :
 
                                          // Affichage  voir plus loin l'opérateur <<
string S01 ("ABCDE");
S01.resize  (/* Nbre = */ 3);
cout << '#' << S01 << '#' << endl;        // #ABC#
cout << S01.size     ()   << endl;        // 3
cout << S01.capacity ()   << endl;        // 8             dépend de l'implémentation

S01.resize  (/* Nbre = */ 2, /* C = */ '.');
cout << '#' << S01 << '#' << endl;        // #AB#
cout << S01.size     ()   << endl;        // 2
cout << S01.capacity ()   << endl;        // 8             dépend de l'implémentation

S01.resize  (/* Nbre = */ 9, /* C = */ '.');
cout << '#' << S01 << '#' << endl;        // #AB.......#
cout << S01.size     ()   << endl;        // 9
cout << S01.capacity ()   << endl;        // 16            dépend de l'implémentation

S01.clear;     // non implémenté ici
cout << '#' << S01 << '#' << endl;        // ##
cout << S01.size     ()   << endl;        // 0
cout << S01.capacity ()   << endl;        // non défini

string S02 ("Coucou");
                          // implémenté ici mais vide
cout << S02.size     ()   << endl;        // 6
cout << S02.capacity ()   << endl;        // 8             dépend de l'implémentation
S02.reserve (6);
cout << S02.size     ()   << endl;        // 6
cout << S02.capacity ()   << endl;        // 8             dépend de l'implémentation
S02.reserve (12);
cout << S02.size     ()   << endl;        // 12
cout << S02.capacity ()   << endl;        // 8             dépend de l'implémentation

Sommaire

Méthodes

 Les fonctions append(), assign(), insert(), erase(), replace() renvoient la référence à la chaîne après modification (qui peut de nouveau être directement utilisée dans une autre opération).

append()

    Insertion en fin de chaîne
 
ident.append ("..." )
ident.append ("...", Nbre)

ident.append (Nbre, C)

ident.append (S)
ident.append (S, Pos, Nbre)

Exemples :
 
                                         // Affichage 
string S0;
string S1 ("perché sur un arbre mort");
string S2 ("perché");
cout << S0.append ("Maitre " )
          .append ("corbeau et renard", /* Nbre = */ 8)
          .append (/* Nbre = */ 3, /* C = */ '.')
          .append (S1, /* Pos = */ 7, /* Nbre = */ 13)
          .append (S2)
     << endl;                            // Maitre corbeau ... sur un arbre perché

Remarques :

  1. Nbre est le nombre maximal possible de caractères ajoutés en fin de chaîne.
  2. Pos doit être valide (<= ident.size())
                                         // Affichage 
string S3, S4;
cout << S3.append ("abcdef", 12) << endl;
                                         // abcdef
string::size_type Pos = S3.size ();
cout << '#' << S4.append (S3, Pos, /* Nbre = */ 10) << '#' << endl;
                                         // ##
// cout << S4.append (S3, Pos + 1, /* Nbre = */ 10) << endl;  // Pos + 1 invalide

Sommaire

assign()

    Affectation
 
ident.assign ("...")
ident.assign ("...", Nbre)

ident.assign (Nbre, C)

ident.assign (S)
ident.assign (S, Pos, Nbre)

Sommaire

erase()

ident.erase (Pos = 0, Nbre = npos)

Exemples :
 
                                         // Affichage 
string S0 ("1234567890");
cout << '#' << S0.erase (/* Pos = */ 4, /* Nbre = */ 2) << '#' << endl;
                                         // #12347890#
cout << '#' << S0.erase (/* Pos = */ 4) << '#' << endl;
                                         // #1234#
cout << '#' << S0.erase () << '#' << endl;
                                         // ##

Sommaire

insert()

ident.insert (Pos, "...")
ident.insert (Pos, "...", Nbre)

ident.insert (Pos, Nbre, C)

ident.insert (Pos,  S)
ident.insert (Pos1, S, Pos2, Nbre)

Exemples :
 
                                         // Affichage 
string S0 ("1234567890");
string S1 ("ABCDEF");
cout << S0.insert (/* Pos  = */ 3, "abc")
          .insert (/* Pos  = */ 3, "def", /* Nbre = */  2)
          .insert (/* Pos  = */ 3, "ghi", /* Nbre = */ 12)
          .insert (/* Pos  = */ 9, /* Nbre = */ 2, '.')
          .insert (/* Pos  = */ 3, S1)
          .insert (/* Pos1 = */ 15, S1, /* Pos2 = */ 4, /* Nbre = */ 2)
    << endl;                            // 123ABCDEFghideaEF..bc4567890

Sommaire

replace()

ident.replace (Pos,  Nbre,  "...")
ident.replace (Pos,  Nbre,  "...", Nbre2)

ident.replace (Pos,  Nbre,  Nbre2, C)

ident.replace (Pos,  Nbre,  S)
ident.replace (Pos1, Nbre1, S, Pos2, Nbre2)

Remarques :

  1. Pos et Nbre (ou Pos1 et Nbre1) concernent les caractères supprimés dans la chaîne initiale.
  2. Nbre2  (et éventuellement Pos2) concernent les caractères de remplacement
Sommaire

swap()

ne renvoie rien.
 
ident.swap (S);

    permute les chaînes ident et S.

Sommaire

c_str()

    Cette fonction permet de transformer une chaîne string en une chaîne NTCTS afin de permettre l'utilisation d'une chaîne string partout où une chaîne NTCTS est nécessaire (voir par exemple les constructeurs de flux).
 
ident.c_str ()

    Le constructeur permet de faire l'opération inverse (obtenir un string à partir d'une NTCTS).

Sommaire

Algorithmes de recherche

find(), rfind(), find_first_of(), find_last_of(),find_first_not_of(), find_last_not_of()
 
  • find(), rfind() : recherchent la première (ou dernière) apparition d'une sous-chaîne dans une chaîne et renvoient la position du premier caractère de la sous chaîne dans la chaîne, quel que soit le sens du parcours.
  • find_first_of(), find_last_of() : recherchent la première (ou dernière) apparition de n'importe lequel des caractères d'une sous-chaîne dans une chaîne et renvoient la position du premier caractère de la sous-chaîne dans la chaîne, quel que soit le sens du parcours.
  • find_first_not_of(), find_last_not_of() : recherchent dans la chaîne initiale le premier (ou dernier) caractère n'appartenant pas à la seconde chaîne.
  •     Toutes ces fonctions renvoient un entier (en fait, de type size_type) qui est la position recherchée (première ou dernière) ou la constante string::npos si non trouvé.
     
    ident.find              (C,     Pos = 0)
    ident.find              (S,     Pos = 0)
    ident.find              ("...", Pos = 0)
    ident.find              ("...", Pos,     Nbre)

    ident.rfind             (C,     Pos = npos)
    ident.rfind             (S,     Pos = npos)
    ident.rfind             ("...", Pos = npos)
    ident.rfind             ("...", Pos,     Nbre)

    ident.find_first_of     (C,     Pos = 0)
    ident.find_first_of     (S,     Pos= 0)
    ident.find_first_of     ("...", Pos = 0)
    ident.find_first_of     ("...", Pos,    Nbre)

    ident.find_last_of      (C,     Pos = npos)
    ident.find_last_of      (S,     Pos = npos)
    ident.find_last_of      ("...", Pos = npos)
    ident.find_last_of      ("...", Pos,    Nbre)

    ident.find_first_not_of (C,     Pos = 0)
    ident.find_first_not_of (S,     Pos = 0)
    ident.find_first_not_of ("...", Pos = 0)
    ident.find_first_not_of ("...", Pos,    Nbre)
     

    ident.find_last_not_of  (C,     Pos = npos)
    ident.find_last_not_of  (S,     Pos = npos)
    ident.find_last_not_of  ("...", Pos = npos)
    ident.find_last_not_of  ("...", Pos,    Nbre)

    Remarques :

    1. Pos est la position de départ de la recherche dans la chaîne initiale
    2. Nbre est le nombre maximal de caractères de la chaîne initiale à l'intérieur desquels est effectuée la recherche
    3. Toutes ces fonctions ci-dessus ne modifient pas la chaîne source (comme des accesseurs), donc sont déclarées const.
    4.  Si elle est valide (!= string::npos), la valeur de retour peut être utilisée comme valeur de position dans une autre fonction (par exemple erase()).
    Exemples :
     
                                                            // Affichage
    string S0 ("Une phrase composée de\nmots");
    cout << S0.erase (S0.find_last_of  (" \t\n")) << endl;  // "Une phrase composée de"
    cout << S0.erase (S0.find_first_of (" \t\n")) << endl;  // "Une"

    Sommaire

    Opérateurs

    Affectation :      =

    ident = expression_de_type_string

    Exemples :
     
                                                  // Affichage
    string S0;
    string S1 ("abcdef");
    cout << (S0 = S1)             << endl;        // abcdef
    cout << (S0 = S1 + "ghi")     << endl;        // abcdefghi       {1}
    cout << (S0 = string ("ABC")) << endl;        // ABC
    cout << (S0 = "ABC")          << endl;        // ABC
    cout << (S0 = '\t' + S1)      << endl;        //     abcdef

    Remarques :

    1. l'expression  est tout d'abord évaluée, puis le résultat est concaténé à la fin de la chaîne S0.
    2. la NTCTS "ABC" est transformée, par appel explicite du constructeur, en un string qui est ensuite affectée à S0,
    3. la NTCTS "ABC" est transformée, par appel implicite du constructeur, en un string qui est ensuite affectée à S0,
    4. La chaîne S1 est tout d'abord concaténée au caractère '\t' en utilisant l'opérateur +, puis la chaîne résultante est ensuite affectée à S0.
    Sommaire

    Concaténation :     +=

        L'opérateur += est identique à l'opérateur +, mais il concatène l'expression_de_type_string  à la fin de la chaîne ident au lieu d'en remplacer le contenu.
     
    ident += expression_de_type_string

    Sommaire

    Fonctions et opérateurs non membres, utilisables avec des strings

    Opérateur de concaténation : +

        L'opérateur + construit un string par concaténation d'un string avec un autre string, un caractère ou un  NTCTS, dans cet ordre ou dans l'ordre inverse.
     
    S1 + S2
    "..." + S
    S + "..."
    C + S
    S + C

        Bien entendu, la propriété d'associativité de l'opérateur + est respectée : S + C + "..." est équivalent à (S + C) + "...".

    Sommaire

    Opérateurs de comparaison :    ==   !=   <   >   <=   >=

    expression1_de_type_string == expression2_de_type_string

    idem pour autres opérateurs

    Sommaire

    Entrées/Sorties

        Les opérateurs << et >> sont surchargés pour les objets de la classe string :
     
    os << S ...
    is >> S ...
    getline (is, S, delim);
    getline (is, S);        // delim = '\n'
    delim  : caractère (type "générique" charT)
    is : flux d'entrée (input stream)
    os : flux de sortie (output stream)
    S1, S2  : de type string
        Au cours de l'exécution de l'instruction : getline (is, S, delim); le délimiteur est extrait du flux mais n'est pas rangé dans la chaîne.

    Sommaire

    Divers

    swap (S1, S2);
    S1, S2  : de type string
    Sommaire

    Voir aussi :

       SGI - Bibliothèque STL : classe basic_string

       Thinking in C++ - B. Eckel : strings

    © D. Mathieu     mathieu@romarin.univ-aix.fr
    I.U.T.d'Aix en Provence - Département Informatique