String_Vector_List

Transcription

String_Vector_List
17/11/2010
Listes des méthodes de la
classe string, et exemples
1
Accès aux prototypes
entier renvoyé ou
nouvelle valeur de ch
exemple d'utilisation
exemple de déclaration
String ch("1abcd2abcd");
1abcd2abcd
longueur d'une chaîne
ch.length()
10
taille d'une chaîne
ch.max_size()
comparaison de chaînes
ch.compare("cd")
-1
modification de l'objet
concaténation (ajout en fin de chaîne) ch += "YY"
1abcd2abcd3YY
insertion
ch.insert(6,"ZZ")
1abcd2ZZabcdYY
(insertion à partir de l'indice 6)
suppression de sous-chaine
ch.erase(6,2)
1abcd2abcdYY
remplacement d'un caractère
ch[4]='?'
1abc?2abcdYY
( utilisation directe des [] )
remplacement de sous-chaine
ch.replace(4,2,"_123451")
1abc_123451abcdYY
(remplacement, à partir de l'indice 4, de 2 caractères )
lecture
d'une
chaîne
fonction externe à la classe
caractère séparateur \n par défaut
String
getline(cin,s);
getline(cin,s,'!');
on
tape
→
s
→ s : abc ...
s;
au
:
clavier:abc
abc
!
...!
def
def
2
1
17/11/2010
recherche
d'une sous-chaîne
ch.find("abc")
1
d'une sous-chaîne
ch.find("zzz")
string::npos
(soit zzz n'est pas une sous-chaîne)
d'une sous-chaîne, depuis la fin
ch.rfind("abc")
11
d'un caractère
ch.find_first_of('b')
2
d'un caractère, depuis la fin
ch.find_last_of('b')
12
d'un caractère d'un ensemble
ch.find_first_of ("yiaueo")
1
(soit la première voyelle en minuscule)
d'un caractère d'un ensemble, depuis la fin
ch.find_last_of ("yiaueo")
11
(soit la dernière voyelle en minuscule)
d'un caractère hors ensemble
ch.find_first_not_of ("1YZ")
1
(soit le premier 'a')
d'un caractère hors ensemble, à partir de la fin ch.find_last_not_of ("1YZ") 14
(soit le dernier 'd')
obtention
d'une sous-chaîne
substr(3,2)
cd
(soit une sous-chaîne de 2 caractères)
d'un caractère
ch[3]
c
de la référence en mémoire
ch.c_str()
0x18a00c48
3
#include <iostream>
#include <string>
using namespace std;
int main ()
{
string str = "Hello";
cout << "str is : " << str << endl;
str += ",";
str += ' ';
cout << "str is : " << str << endl;
string s;
s = str + "World";
cout << "s is : " << s << endl;
char ch = '!';
s += ch;
cout << "s is : " << s << endl;
return 0;
}
OUTPUT:
// str is : Hello
// str is : Hello,
// s is : Hello, World
// s is : Hello, World!
4
2
17/11/2010
STL vector et list
Les tableaux (vector)
La classe vector est définie dans le fichier d'entête :
#include <vector>
Le tableau est le conteneur le plus pratique de la STL. Il encapsule
efficacement les tableaux dynamiques en gérant la réallocation et
les recopies.
Un tableau connait 2 valeurs:
sa taille: le nombre d'éléments qu'il contient,
sa capacité: le nombre d'éléments qu'il peut contenir.
Quand l'ajout d'un élément entraîne (taille>capacité) alors le tableau se réalloue en
doublant sa capacité (stratégie classique).
Pour déclarer un tableau contenant des int, on utilisera :
vector<int> v;
Le tableau a alors une taille nulle (on ne s'occupe pas de sa capacité).
Pour ajouter des éléments, on peut utiliser push_back,push_front.
5
Méthodes Description
begin() renvoie un itérateur sur le premier élément du vecteur.
end() renvoie un itérateur sur le dernier élément du vecteur.
assign() remplit le vecteur à la manière des constructeurs :
b.assign(a.begin(),a.end()) ;
ceci rempli le vecteur b avec le contenu du vecteur a.
Une autre utilisation de assign() :
b.assign(10,0) ;
rempli les dix premiers élément avec la valeur 0.
at() renvoie l’élément situé à la ième position :
a.at(10) ;
renvoie l’élément situé à la 11ième position (les vecteurs
commencent à l’indice 0)
6
3
17/11/2010
front() renvoie le premier élément du vecteur (ne renvoie pas un
itérateur).
back() renvoie le dernier élément du vecteur (ne renvoie pas un
itérateur).
capacity() renvoie le nombre de case mémoire disponible avant de
réallouer de la mémoire
clear() supprime tous les éléments du vecteur.
empty() renvoie un booléen indiquant si le vecteur est vide (true) ou
non (false)
erase() Supprime un élément ou une plage de valeur :
a.erase(10) ; //supprime le 11ème élément.
a.erase(a.begin(),a.end()) ; // equivalent à a.clear() ;
insert() insère un ou plusieurs éléments dans un vecteur.
a.insert(10,2) ; //insère la valeur 2 à la 11 ème place.
a.insert(10,2,3) ; //insère 2 fois la valeur 3 à partir de la 11ème
position.
pop_back() supprime et renvoie le dernier élement du
vecteur.
7
push_back() insère un élément à la fin du
vecteur.
reserve() ajoute n cases mémoires au vecteur.
resize() change la taille du vecteur.
size() renvoie le nombre d’élément du tableau
(attention différent de capacity() )
swap() échange deux éléments de deux
vecteurs.
8
4
17/11/2010
Pour accéder directement aux éléments d'un
tableau, en lecture ou en écriture, on utilise la
notation [] classique:
#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<int> v;
v.push_back(3); // le tableau vaut [3] et est de taille 1
v.push_front(4); // le tableau vaut [4,3] et est de taille 2
cout<<v[0];
// renvoie 4
v[1] = 5;
cout<<v[1];
// renvoie 5
}
9
Attention, aucun contrôle de dépassement
d'indice n'est effectué (sinon la classe serait
trop lente et pas assez générique).
Si vous tentez d'accéder un élément au delà
de la taille du tableau, vous risquez le
plantage
10
5
17/11/2010
La notion d'itérateur
L'itérateur est une généralisation des pointeurs. Il
permet de parcourir en séquence les éléments
d'un conteneur. Pour comprendre l'analogie,
regardons le code C classique suivant:
void lower(char* t,const unsigned int& taille)
{
for(unsigned int i=0;i<taille;++i)
{
t[i] = lowercase(t[i]); /(***)
}
}
11
Afin d'optimiser un tel parcours de tableau
(pour éviter,à la ligne (***), de calculer deux
fois un déplacement de i par rapport à
l'adresse de base de t), les programmeurs C
ont l'habitude de remplacer ce code par le
code suivant:
void lower(char* t,const unsigned int& taille){
for(char *p = t,*pstop = t+taille;p < pstop;++p) {
*p = lowercase(*p);
}}
12
6
17/11/2010
Un itérateur, ça correspond au pointeur p.
Ca "pointe"sur un objet, et ça sait passer à
l'objet suivant dans le conteneur.
Un itérateur est donc lié à conteneur en
particulier. Il a notamment besoin de
connaître le type des objets du conteneur
(pour avoir la taille et savoir "passer au
suivant").
13
Pour cela, le type iterator est un type membre des
classes conteneurs (c'est ce que l'on appelle un
trait).
La déclaration d'un itérateur sur un vector d'entiers
se fait donc de la manière suivante:
vector<int>::iterator i;
Pour que cette itérateur pointe sur le premier
élément d'un vector donné, on utilise la méthode
begin() de cet vector comme ci-dessous:
vector<int> v;
vector<int>::iterator i = v.begin();
14
7
17/11/2010
Ainsi la traduction en STL de l'exemple donné
en introduction est:
void lower(vector<char>& t){
for (vector<char>::iterator i = t.begin(),istop=t.end(); i != istop;++i)
{
*i = lowercase(*i);
}}
L'itérateur end() est en fait assez spécial.
Il pointe sur "après" le dernier élément du
conteneur.
15
Les listes (list)
La classe list est définie dans le fichier d'entête
:
#include <list>
Pour déclarer une liste contenant des int, on
utilisera :
list<int> l;
16
8
17/11/2010
Pour insérer ou retirer des éléments dans la
liste, on utilisera les commandes suivantes:
#include <list>
using namespace std;
void main(){
list<int> l;
l.push_front(3); // la liste vaut 3::[]
l.push_front(2); // la liste vaut 2::3::[]
l.push_back(4); // la liste vaut 2::3::4[]
l.pop_front(); // la liste vaut 3::4[]
l.pop_back(); // la liste vaut 3::[]}
17
Les fonctions pop_back et pop_front ne retournent
pas de valeurs. Elles ne font que dépiler la valeur de
queue ou de tête.
Pour accéder à la valeur de queue ou de tête, sans
les dépiler, on utilisera:
l.front(); // Retourne la valeur en tête de liste
l.back(); // Retourne la valeur en queue de liste
Il est à noter que ces 2 fonctions retournent des
références, c'est à dire qu'on peut s'en servir pour
modifier le premier où le dernier élément d'une liste
comme dans l'exemple ci-dessous:
l.front() = 4;
18
9
17/11/2010
Les méthodes:
size_t size() const;

Nombre d’élément.
void push_back(const T& x);

Ajoute l’élément x en fin de liste.
void pop_back();

Supprime le dernier élément de la liste.
iterator insert(iterator position, const T& x);

Insert l’élément x devant l’élément désigné par position.
iterator insert(iterator position);

Insert un élément construit par défaut devant l’élément désigné par position.
void insert(iterator position, const_iterator first, const_iterator last);

Insert une séquence d’élément désigné par first et last devant l’élément désigné par position.
iterator erase(iterator position);

Efface l’élément à la position donnée.
iterator erase(iterator first, iterator last);

Efface les éléments entre first et last exclus.
void clear();

Efface tous les éléments de la list.
19
Les méthodes spécifique à la classe List:
void remove(T valeur)

Supprime tous les éléments égaux à valeur.
void sort()

Tri la liste dans l’ordre croissant.
void unique()

Elimine les éléments en double dans une liste triée.
void merge(const list<T>)

Fusionne la liste list avec la liste concernée. A la fin de
l’opération, list est vide.
20
10