STL : La librairie Algorithm - David Saint

Transcription

STL : La librairie Algorithm - David Saint
Langage C++
STL - Les fonctions algorithmes
05/02/03
STL - Les fonctions algorithmes
1
INTRODUCTION .......................................................................................................................................................... 1
1.1
1.2
1.3
1.4
2
OPÉRATIONS GÉNÉRALES DE MANIPULATION DES DONNÉES ......................................................................................... 3
2.1
2.2
2.3
3
Tester l’égalité de contenu : equal() ................................................................................................................................... 14
Rechercher les objets dichotomiques (différents) : mismatch()............................................................................................ 14
Tester l’infériorité - Comparaison lexicographique : lexicographical_compare().................................................................. 14
LES OPÉRATIONS ENSEMBLISTES SUR 2 SÉQUENCES ................................................................................................... 15
7.1
7.2
7.3
7.4
7.5
7.6
7.7
8
Trier tous les objets : sort(), stable_sort(), partial_sort()...................................................................................................... 12
Trier partiellement les objets : partial_sort() ....................................................................................................................... 12
Inverser l’ordre des objets : reverse() ................................................................................................................................. 13
Mélanger les objets : random_shuffle() .............................................................................................................................. 13
OPÉRATIONS DE COMPARAISON DE 2 SÉQUENCES ...................................................................................................... 14
6.1
6.2
6.3
7
Position du plus Petit et du plus Grand : min_element(), max_element() ............................................................................... 9
Rechercher la 1ère occurrence : find(), find_if(), find_first_of(), search(), find_end(),search_n().......................................... 9
Position du 1er doublons : adjacent_find() ........................................................................................................................... 10
Position pour insérer une valeur dans une séquence triée : lower_bound(), upper_bound(), equal_range() ............................ 11
OPÉRATIONS D'ORDONNANCEMENT .......................................................................................................................... 12
5.1
5.2
5.3
5.4
6
Supprimer des objets : remove(), remove_if() et unique() .................................................................................................... 5
Remplacer des objets : replace(), replace_if() ....................................................................................................................... 6
Appliquer un traitement à des objets : transform() et for_each() ............................................................................................ 7
Rechercher si une valeur est présente: binary_search().......................................................................................................... 8
Compter des objets : count () et count_if ()........................................................................................................................... 8
OPÉRATIONS DE RECHERCHE DE LA POSITION D’UN OBJET PARTICULIER ....................................................................... 9
4.1
4.2
4.3
4.4
5
Copier : copy() et copy_backward() .................................................................................................................................... 3
Initialiser et remplir fill(), fill_n(), generate(), generate_n()................................................................................................... 3
Echanger les objets de 2 séquences : swap_ranges() ............................................................................................................. 4
OPÉRATIONS SUR UNE SÉQUENCE AVEC UN CRITÈRE .................................................................................................... 5
3.1
3.2
3.3
3.4
3.5
4
Les fonctions....................................................................................................................................................................... 2
La séquence d’un conteneur................................................................................................................................................. 2
Cas du tableau..................................................................................................................................................................... 2
Notations adoptées .............................................................................................................................................................. 2
Vérifier l’inclusion d’une séquence dans une autre ............................................................................................................. 15
Effectuer l’intersection de 2 séquences : set_intersection().................................................................................................. 15
Fusionner 2 séquences : merge() ........................................................................................................................................ 15
Faire l’union de 2 séquences : set_union () ......................................................................................................................... 16
Fusionner au sein d’une séquence : inplace_merge()........................................................................................................... 16
Etablir la différence de 2 séquences : set_difference(), set_ symmetric_difference() ............................................................ 16
Partitionner une séquence selon un critère : partition(), stable_partition() ............................................................................ 18
TABLE DES EXEMPLES DE CODE ................................................................................................................................ 18
1 INTRODUCTION
Le terme séquence est utilisé ici pour indiquer une suite d’objets.
La majorité des fonctions sont présentées, il manque : make_heap(), max(), min(), next_permutation(),
nth_element(), pop_heap(), prev_permutation (), push_heap(), rotate(), rotate_copy(), sort_heap(), swap().
Le conteneur vector est souvent utilisé dans les exemples.
David Saint-Mellion
page 1/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
1.1 Les fonctions
La librairie standard «STL» définit un jeu de fonctions « Templates » traitant les algorithmes les plus connus.
Elles sont définies dans l'en-tête <algorithm>. Elles réalisent toutes les opérations classiques comme : la
création, la copie, la suppression, le remplacement, l’ordonnancement (tri). Elles s’appliquent à une séquence
d’objets d’un conteneur. Elles peuvent opérer sur 2 conteneurs de nature différents à condition qu’ils
contiennent des objets de même type, Exemples : Copier la séquence d’un tableau d’entiers dans une liste
d’entiers ou bien, comparer une séquence d’une liste de flottants avec une séquence de flottants d’un vector.
De manière générale ces fonctions :
• Reçoivent en paramètres les 2 itérateurs définissant une
ItrPrem
itrDer
séquence dans un conteneur source.
• Parcourent la séquence pour effectuer le
1 2 3 4 5 6 7 8 9
traitement.
Exemple : Afficher un tableau de 10 entiers à l’écran :
int source[10]={1,2,3,4,5,6,7,8,9,10};
ostream_iterator<int> ecran(cout," "); // Définition d’un itérateur adaptateur
copy(source,source+10,ecran);
Les conteneurs disposent de fonctions membres issues de <algorithm> adaptées à son type. Il faut privilégier
l’emploi de ses fonctions. En général, elles opèrent sur l’ensemble des objets du conteneur alors que les
fonctions de <algorithm> peuvent opérer sur seulement une partie des données d’un conteneur.
1.2 La séquence d’un conteneur
Un conteneur (vector, liste, ..., un tableau) contient une série d’objets de même type et qui se suivent. La
séquence est définie par 2 itérateurs. L’intervalle ainsi défini constitue un espace ouvert : le dernier objet pointé
par itrDer n’appartient pas à l’intervalle, ici itrDer =itrPrem+10. Une séquence peut être constituée par tous les
objets d’un conteneur ou une seulement une partie. Pour accéder à un objet de la séquence, il suffit de
déplacer l’itérateur : Exemple pour accéder à l’objet 3, itrAcces3=irtDébut+2.
Les conteneurs de la STL disposent de 2 fonctions renvoyant les itérateurs Début et Fin du conteneur : Début
du conteneur - begin() et Fin du conteneur - end().
Pour l’exemple de la séquence ci-dessus contenue complètement d’un conteneur «monVector», l’accéder à
l’objet 3 se réalise par : itrAcces3=monVector. begin()+3 ou itrAcces3=monVector.end()-7.
1.3 Cas du tableau
C’est le conteneur «rustique» hérité du langage C. Le pointeur sur un objet du tableau est vu comme un
itérateur. Les fonctions de l'en-tête <algorithm> peuvent s’appliquer aux tableaux.
1.4 Notations adoptées
Les itérateurs
Notation
ItrInput
ItrOutput
ItrForward
ItrBidirectional
ItrRandomAccess
Type d’itérateur
input_iterator
outpout_iterator
forward_iterator
bidirectional_iterator
random_acces_iterator
Types de fontceurs ou fonctions
generator
Fonction avec aucun paramètre, retourne la valeur d’un objet
predicate
Foncteur avec 2 paramètres et retourne un booléen
predicateBinaire
Foncteur avec 2 paramètres et retourne un booléen
operationUnaire
Foncteur avec 1 paramètre et retourne une valeur
operationBinaire
Foncteur avec 2 paramètres et retourne une valeur
function
Foncteur adaptateur
compare
Fonction compare au sens de l’infériorité
David Saint-Mellion
page 2/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
2 OPÉRATIONS GÉNÉRALES DE MANIPULATION DES DONNÉES
2.1 Copier : copy() et copy_backward()
La fonction copy() : copie une séquence ailleurs (3ème argument). La fonction backward_copy copie une
séquence ailleurs en partant de la fin. La séquence copiée peut être affectée soit au même conteneur, soit à un
autre conteneur.
• itrOutput copy(itrInput prem, itrInput der, itrOutput destination);
• itrBidirectional copy_backward(itrBidirectional prem, itrBidirectional der,
itrBidirectional fin_destination);
Exemple 1 : Copier et afficher
#include <iostream>
#include <vector>
#include <algorithm> // pour copy
using namespace std;
int main(void){
int source[10]={1,2,3,4,5,6,7,8,9,10};
// Définit un vector de 10 entiers
vector<int> destination(10);
// Copie les objets de itérateur Début "source" à itérateur Fin
// "source+4"(non compris), dans destinationDebut "destination.begin()"
copy(source,source+4,destination.begin());
// Copie inverse les objets référencés de itérateur Début
// à itérateur Fin (objet non compris) à partir de destinationFin
copy_backward(source+4,source+8,destination.end());
// Définit un itérateur adaptateur sur la sortie standard
ostream_iterator<int> ecran(cout," ");
// Affiche à l'écran avec la fonction copy
copy(source,source+10,ecran);
cout<<endl;
copy(destination.begin(),destination.end(),ecran);
cout<<endl;
return 0;
}
Résultat de l’exécution
1 2 3 4 5 6 7 8 9 10
1 2 3 4 0 0 5 6 7 8
Remarques :
• La fonction membre des conteneurs, assign(), copie seulement à partir du début du conteneur dans
destination.
• Dans l’exemple, l’utilisation d’un itérateur adaptateur permet de disposer d’un itérateur sur un flux de
données en sortie et de traiter l’affichage à l’écran grâce à la fonction copy(). Il en est de même pour les flux
d’entrée. Ce principe s’applique aussi au flux fichier. Exemple :
// Définit un vector de flottants
vector<float> vecCote;
// Lit le fichier et insère les valeurs dans le vector
copy(istream_iterator<float>(fichierCote), istream_iterator<float>(),
back_inserter(vecCote) // Insère l’objet à la fin du vector
);
// Définit un itérateur adaptateur pour écrire dans le fichier.
// Le séparateur des données est \n
ostream_iterator<float> itrFichier (fichierCote,"\n");
// Ecrit dans le flux fichiers
copy(vecCote.begin(),vecCote.end(),itrFichier);
2.2 Initialiser et remplir fill(), fill_n(), generate(), generate_n()
Ces fonctions initialisent un conteneur avec une valeur ou génèrent une série de valeurs pour l’initialiser.
La fonction fill() affecte une valeur (3ème argument) à chaque objet d’une séquence.
David Saint-Mellion
page 3/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
La fonction generate() remplit une séquence à partir des valeurs générées par une fonction (3ème argument), à
chaque appel elle produit une valeur. Elle ne prend aucun paramètre et renvoie la nouvelle valeur.
Les fonctions sont disponibles sous 2 versions. Pour la 1ère version, l’intervalle de la séquence est repéré par
les 2 premiers itérateurs, pour la 2ème version, la séquence est définie par un itérateur sur le premier objet et le
nombre d’objets.
• void fill(itrForward prem, itrForward der, const T &valeur);
• void fill_n(itrOutput prem, Size nombre, const T &valeur);
• void generate(itrForward prem, itrForward der, generator g);
• void generate_n(itrOutput prem, Size nombre, generator g);
2.3 Echanger les objets de 2 séquences : swap_ranges()
La fonction swap_ranges() intervertit les objets entre 2 séquences.
• itrForward swap_ranges(itrForward prem, itrForward der, itrForward
destination);
Exemple 2 : Initialiser et échanger des objets
#include <iostream>
#include <deque>
#include <vector>
#include <algorithm>
#include <iterator>
// pour ostream_iterator
using namespace std;
int serieA2(){
// Génère une série arithmétique
static int a=0;
return (a=a+2);
}
int serieG2(){
// Génère une série géométrique
static int g=1;
return (g=g*2);
}
int main(void){
int tab[10];
deque<int> maDeq;
vector<int> monVecteur;
ostream_iterator<int> ecran(cout," ");
// Remplit le tableau avec 255
fill(tab,tab+10,255);
// Remplit un vecteur de 10 objets avec la série arithmétique
generate_n(back_inserter(monVecteur),10,serieG2);
// Remplit une deque de 10 objets avec la série géométrique
generate_n(back_inserter(maDeq),10,serieA2);
// Affiche les valeurs des 3 conteneurs
copy(tab, tab+10,ecran);
cout<<endl;
copy(monVecteur.begin(),monVecteur.end(),ecran);
cout<<endl;
copy(maDeq.begin(),maDeq.end(),ecran);
cout<<endl<<endl<<"Echange entre le tableau et momVecteur"<<endl;
// Echange entre le tableau et momVecteur
swap_ranges(tab, tab+4, monVecteur.begin());
copy(tab, tab+10,ecran);
cout<<endl;
copy(monVecteur.begin(),monVecteur.end(),ecran);
cout<<endl<<endl<<"Echange dans la deque "<<endl;
// Echange dans la queue
swap_ranges(maDeq.begin(), maDeq.begin()+4, maDeq.begin()+6);
copy(maDeq.begin(),maDeq.end(),ecran);
cout<<endl;
David Saint-Mellion
page 4/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
return 0;
}
Résultat de l’exécution
255 255 255 255 255 255 255 255 255 255
2 4 8 16 32 64 128 256 512 1024
2 4 6 8 10 12 14 16 18 20
Echange entre le tableau et momVecteur
2 4 8 16 255 255 255 255 255 255
255 255 255 255 32 64 128 256 512 1024
Echange dans la deque
14 16 18 20 10 12 2 4 6 8
3 OPÉRATIONS SUR UNE SÉQUENCE AVEC UN CRITÈRE
Les fonctions effectuent un traitement systématique à tous les objets ou opérer seulement sur ceux qui ont une
valeur particulière ou répondant à un critère afin de les supprimer, remplacer, compter.
Les versions utilisant une fonction prédicat, exemple remove_if () opèrent sur les objets de la séquence lorsque
la fonction prédicat retourne false. L’itérateur retourné repère l'objet après le dernier objet de la séquence
résultat. Les versions qui ont pour suffixe _copy placent le résultat dans une séquence sans modifier la
séquence d’origine.
3.1 Supprimer des objets : remove(), remove_if() et unique()
Ces fonctions sont utilisées pour effectuer un filtre dont le but est de supprimer des objets selon un critère.
La fonction remove() supprime les objets de la séquence ayant une valeur particulière et remove_copy duplique
ces objets dans une autre séquence.
• itrForward remove(itrForward prem, itrForward second, const T &valeur);
• itrOutput remove_copy(itrInput prem, itrInput second, itrOutput destination,
const T &valeur);
La fonction remove_if () supprime tous les objets d’une séquence ne répondant pas à une condition et
remove_if () duplique ces objets dans une autre séquence.
• itrForward remove_if(itrForward prem, itrForward second, predicate p);
• itrOutput remove_copy_if(itrInput prem, itrInput second, itrOutput destination,
predicate p);
Les fonctions - unique() - suppriment les doublons : 2 valeurs qui se suivent dans la séquence.
• itrForward unique(itrForward prem, itrForward der);
• itrOutput unique_copy(itrForward prem, itrForward der);
• itrForward unique(itrForward prem, itrForward der, predicateBinaire p);
• itrOutput unique_copy(itrForward prem, itrForward der, predicateBinaire p);
Exemple 3 : Supprimer des objets
#include <iostream>
#include <algorithm>
#include <vector>
#include <list>
#include <functional> // pour ptr_fun
using namespace std;
bool plusGrandt(int val){
return (val<50);
}
int soureceData[10]={20,11,52,11,54,55,11,52,11,23};
int main(void){
vector<int> data(soureceData,soureceData+10);
list<int> destination(10);
// Définit les itérateurs
vector<int>::iterator itrDerVtr=NULL; // Définit un itr de vector d'entiers
list<int>::iterator itrDerLte=NULL; // Définit un itr d'une liste d'entiers
David Saint-Mellion
page 5/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
ostream_iterator<int> ecran(cout," "); // Définit un itr sortie standard
// Supprime les objets valant 11 et récupère la valeur de l'itérateur fin
itrDerVtr=remove(data.begin(),data.end(),11);
copy(data.begin(),itrDerVtr,ecran);
cout<<endl;
// Crée une copie des objets supérieurs à 49
// Récupère la valeur de l'itérateur de fin
itrDerLte=remove_copy_if(data.begin(),data.end(),
destination.begin(),ptr_fun(&plusGrandt));
copy(data.begin(),itrDerVtr,ecran);
cout<<endl;
copy(destination.begin(),itrDerLte,ecran);
cout<<endl;
// Supprime les doublons, 2 valeurs qui se suivent
// Récupère la valeur de l'itérateur de fin
itrDerLte=unique(destination.begin(),itrDerLte);
copy(destination.begin(),itrDerLte,ecran);
cout<<endl;
return 0;
}
Résultat de l’exécution
20 52 54 55 52 23
20 52 54 55 52 23
52 54 55 52 52
52 54 55 52
Remarque :
Ces fonctions ne modifient la séquence à partir de l’itérateur renvoyé.
Exemple : remove(data.begin(),data.end(),11
• Séquence avant exécution :
20,11,52,11,54,55,11,52,11,23
• Séquence après l’exécution :
20 52 54 55 52 23 11 52 11 23
Ce n’est pas le cas des fonctions erase() des conteneurs ou remove() du conteneur list qui procèdent par
écrasement des valeurs à supprimer en copiant la séquence qui suit.
3.2 Remplacer des objets : replace(), replace_if()
La fonction replace() remplace tous les objets ayant une valeur particulière par une nouvelle valeur et
replace_copy() crée une copie des objets modifiés ailleurs.
• void replace(itrForward prem, itrForward der, const T ancienne_valeur, const T
&nouvelleVal);
• void replace_if(itrForward prem, itrForward der, predicate p,
const T &nouvelleVal);
La fonction replace_copy () supprime les objets de la séquence ne répondant pas à une condition et
replace_copy_if() duplique ces objets dans une autre séquence. La condition est définie par une fonction
prédicat.
•
void replace_copy(itrInput prem, itrInput der, itrOutput destination, const T
&ancienne_valeur, const T &nouvelleVal);
• void replace_copy_if(itrInput prem, itrInput der, itrOutput destination,
predicate p, const T &nouvelleVal);
Exemple 4 : Rechercher et remplacer des objets
#include <iostream>
#include <algorithm>
#include <list>
#include <vector>
#include <functional>
// pour ptr_fun
using namespace std;
bool plusPetit(int val){
return (val<10);
David Saint-Mellion
page 6/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
}
int sourceData[10]={1,1,50,1,4,10,6,7,1,9}; // Data source
int main(void){
vector<int> vec(sourceData, sourceData+10);
list<int> data(10);
ostream_iterator<int> ecran(cout," ");
// Remplace tous les objets valant 1 par des 88
replace(vec.begin(),vec.end(),1,88);
copy(vec.begin(),vec.end(),ecran);
cout<<endl;
// Remplace tous les objets < à 10 par 0
replace_copy_if(vec.begin(),vec.end(),data.begin(),ptr_fun(&plusPetit),0);
copy(data.begin(),data.end(),ecran);
cout<<endl;
return 0;
}
Résultat de l’exécution
88 26 56 88 4 18 6 4 88 4
88 26 56 88 0 18 0 0 88 0
3.3 Appliquer un traitement à des objets : transform() et for_each()
La fonction for_each() effectue une opération de lecture des objets de la séquence. Elle transmet chaque objet à
une fonction.
• function for_each(itrInput prem, itrInput der, function f);
La fonction transform() modifie les objets d'une séquence en leur appliquant une fonction de traitement. La
première version applique une fonction unaire sur l’objet «prem», place le résultat dans «destination» et itère.
L’autre version applique une fonction binaire sur deux objets «prem1», «prem2», place le résultat dans
«destination» et itère sur les 2 éléments.
• itrOutput transform(itrInput prem, itrInput der, itrOutput destination,
operationUnaire op);
• itrOutput transform(itrInput prem1, itrInput der1, itrInput prem2, itrOutput
destination, operationBinaire op);
Exemple 5 : Parcourir et traiter les objets d’une séquence
#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>
#include <functional>
// pour negate<int>() et ptr_fun
using namespace std;
int afficher(int val){
// Affiche val
cout<<val<<' ';
return 0;
}
int ajouter(int val){
// Ajoute 10
return (val+10);
}
int calculer(int val1, int val2){ // Fait le calcul
static n=0;
return (val1+val2+n++);
}
// Data source
int sourceData[10]={0,-1,-2,3,4,5,6,7,8,9};
int main(void){
// Définit un vector et l'initialise
vector<int> source(sourceData,sourceData+10);
// Définit une deque de 10 entiers
David Saint-Mellion
page 7/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
deque<int> dest(10);
// Parcourt le vector et inverse la valeur de l'objet
// La fonction negate() est une fonction instanciée pour un entier
// dest[n] <-- -source[n]
transform(source.begin(),source.end(),dest.begin(),negate<int>());
// Affiche le résultat
for_each(dest.begin(),dest.end(),ptr_fun(&afficher));
cout<<endl;
// source[n] <-- source[n]+10 à chaque objet
transform(source.begin(),source.end(),source.begin(),ptr_fun(&ajouter));
// Affiche le résultat
for_each(source.begin(),source.end(),ptr_fun(&afficher));
cout<<endl;
// dest[n]<-- dest[n]+source[n]+1
transform(source.begin(),source.end(),
dest.begin(),dest.begin(),ptr_fun(&calculer));
for_each(dest.begin(),dest.end(),ptr_fun(&afficher));
cout<<endl;
return 0;
}
Résultat de l’exécution
0 1 2 -3 -4 -5 -6 -7 -8 -9
10 9 8 13 14 15 16 17 18 19
10 11 12 13 14 15 16 17 18 19
3.4 Rechercher si une valeur est présente: binary_search()
La fonction binary_search() indique si une valeur est présente dans une séquence triée. Elle renvoie un bool détermine
si un objet est au moins est équivalent à une valeur donnée ou au sens d'une fonction fourni en paramètre.
• bool binary_search(itrForward prem, itrForward der, const T &valeur);
• bool binary_search(itrForward prem, itrForward const T &valeur, compare c);
3.5 Compter des objets : count () et count_if ()
La fonction count()compte le nombre d’occurrences d’une valeur.
• count(itrInput prem, itrInput der, const T &valeur);
La fonction count_if()compte le nombre d’objets répondant à une condition.
• count_if(itrInput prem, itrInput der, predicate p);
Exemple 6 : Compter des objets d’une séquence
#include <iostream>
#include <algorithm>
#include <functional>
// pour ptr_fun
#include <deque>
using namespace std;
bool valPair(int val){
return (val&1)==0;
}
// Teste si la valeur est paire
int sourceData[10] = {1,81,7,32,14,53,16,7,68,91}; // Data source
int main(void){
deque<int> source(10); // Définit une deque de 10 entiers
int nbrePair=0;
int nbreSept=0;
copy(sourceData, sourceData+10,source.begin());
// Compte le nombre d'objets pairs
nbrePair=count_if(source.begin(),source.end(),ptr_fun(&valPair));
// Compte le nombre d'objets supérieurs à 7
nbreSept=count(source.begin(),source.end(), 7);
cout<< nbrePair<<" Elements sont pairs"<< endl;
David Saint-Mellion
page 8/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
cout<< nbreSept<<" Elements valent 7"<< endl;
return 0;
}
Résultat de l’exécution
4 Elements sont pairs
2 Elements valent 7
4 OPÉRATIONS DE RECHERCHE DE LA POSITION D’UN OBJET PARTICULIER
4.1 Position du plus Petit et du plus Grand : min_element(), max_element()
Deux fonctions permettent d'obtenir la position du plus petit et le plus grand des objets d'une séquence. Elles
retournent un itérateur référençant l’objet le plus petit ou le plus grand.
• itrForward min_element(itrForward prem, itrForward der);
• itrForward min_element(itrForward prem, itrForward der, compare c);
• itrForward max_element(itrForward prem, itrForward der);
• itrForward max_element(itrForward prem, itrForward der, compare c);
Exemple 7 : Rechercher la position du Maxi et du Mini
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
// Data Source
int sourceDat[10]={2,-3,17,5,4,11,8,1,19,6};
int main(void){
// Définit un vector et l'initialise
vector<int> data(sourceDat,sourceDat+10);
// Définit 2 variables itérateur vector d'entiers
vector<int>::iterator min;
vector<int>::iterator max;
// Recherche la position du min et du max
min=min_element(data.begin(), data.end());
max=max_element(data.begin(), data.end());
// Affiche la position et la valeur du min et du max
cout<<"Le plus Petit est en "<<min-data.begin()<<" et vaut "<<min[0]<<endl;
cout<<"Le plus Grand est en "<<max-data.begin()<<" et vaut "<<max[0]<<endl;
return 0;
}
Résultat de l’exécution
Le plus Petit est en 1 et vaut -3
Le plus Grand est en 8 et vaut 19
4.2 Rechercher la 1ère occurrence : find(), find_if(), find_first_of(), search(),
find_end(),search_n()
Ces fonctions recherchent la position d’un objet répondant à un critère : une valeur, un motif ou défini par une
fonction.
ème
Les fonctions find() et find-if() renvoie un itérateur sur le premier objet correspondant (3
argument) à une
valeur ou à critère défini par une fonction prédicat unaire.
• itrInput find(itrInput prem, itrInput der, const T &valeur);
• itrInput find_if(itrInput prem, itrInput der, predicate p);
La fonction find_first_of() renvoie un itérateur sur le premier objet qui est égal à une des valeurs d'une autre
séquence. Elle prend deux couples d'itérateurs en paramètre. Le premier définit la séquence sur lequel
s’applique la recherche. Le deuxième définit la séquence spécifiant les valeurs servant à la recherche. Une
deuxième version de la fonction effectue la recherche avec une fonction prédicat binaire. Elle reçoit pendant
l’exécution en paramètre l'objet courant et une des valeurs de la séquence «prem2» et «dern2»
David Saint-Mellion
page 9/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
•
itrInput find_first_of(itrInput prem1, itrInput der1, itrForward prem2,
itrForward der2);
• itrInput find_first_of(itrInput prem1, itrInput der1, itrForward prem2,
itrForward der2, predicateBinaire p);
Un motif est suite de valeurs. La fonction search() renvoie l’itérateur sur la première occurrence d'un motif.
La fonction find_end() renvoie l’itérateur sur la dernière occurrence d'un motif.
• itrForward search(itrForward prem1, itrForward der1, itrForward prem2,
itrForward der2);
• itrForward search(itrForward prem1, itrForward der1, itrForward prem2,
itrForward der2, predicateBinaire p);
• itrForward find_end(itrForward prem1, itrForward der1, itrForward prem2,
itrForward der2);
• itrForward find_end(itrForward prem1, itrForward der1, itrForward prem2,
itrForward der2, predicateBinaire p);
La fonction search_n() recherche une série de valeurs identiques. Elle renvoie la position de la première
occurrence de la série de valeurs.
• itrForward search_n(itrForward prem, itrForward der, Size nombre, const T
&valeur);
• itrForward search_n(itrForward prem, itrForward der, Size nombre, const T
&valeur, predicateBinaire p);
4.3 Position du 1er doublon : adjacent_find()
La fonction adjacent_find() renvoie l'itérateur sur le premier doublon. Si aucun objet ne répond au critère de
recherche l’itérateur retourné est itrDernier. Il est inutile de préciser valeur. Un doublon est constitué par deux
valeurs qui se suivent.
• itrForward adjacent_find(itrForward prem, itrForward der);
La version avec un prédicat binaire définit la relation de comparaison utilisée.
• itrForward adjacent_find(itrForward prem, itrForward der, predicateBinaire p);
Exemple 8 : Rechercher de positions - Occurrence et doublon
#include <iostream>
#include <algorithm>
#include <functional>
// pour ptr_fun
#include <vector>
using namespace std;
bool impair(int val){
// Teste si la valeur est impaire
return ((val&1)!=0);
}
// Data source
int sourceData[10] ={12,12,21,30,4,4,4,21,30,4};
int motifData[3] ={21,30,4};
int main(void) {
// Définit et Initialise 2 vectors d'entiers
vector<int> source(sourceData,sourceData+10);
vector<int> motif(motifData,motifData+3);
// Définit des itérators de vectors d'entiers
vector<int>::iterator itrDebut =source.begin();
// Début source
vector<int>::iterator itrDernier =source.end();
// Dernier source
vector<int>::iterator itrTrouve=NULL;
// Variable
vector<int>::iterator itrTrouveDer;
// Variable
vector<int>::iterator itrIndex;
// Variable d'index
// Recherche la première nombre impair
itrTrouve=find_if(itrDebut,itrDernier,ptr_fun(&impair));
cout<<"Premiere occurrence d'un nombre impair en "
<<itrTrouve-itrDebut<<endl;
David Saint-Mellion
page 10/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
// Recherche la première occurrence du motif 4 4 4
itrTrouve=search_n(itrDebut,itrDernier,3,4);
cout<<"Premiere occurrence 4-4-4 est en "<<itrTrouve-itrDebut<<endl;
// Recherche la position de tous les doublons
itrIndex=itrDebut;
// Initialise la variable d'index
while ((itrTrouve=adjacent_find(itrIndex,itrDernier))!=itrDernier) {
cout<<"Doublon en "<<itrTrouve-itrDebut;
cout<<" Valeurs "<<itrTrouve[0]<<"-"<<itrTrouve[1]<<endl;
// Déplace Début pour continuer l'analyse de la séquence
itrIndex=itrTrouve+1;
}
// Recherche la première occurrence du motif 3 21 30
itrTrouve=search(itrDebut,itrDernier,motif.begin(),motif.end());
// Recherche la dernière occurrence du motif 3 21 30
itrTrouveDer=find_end(itrDebut,itrDernier,motif.begin(),motif.end());
// Traite l'affichage des occurrences du motif
if (itrTrouve==itrDernier)
cout<<"Il n'y a pas occurrence 3 21 30" <<endl;
else if(itrTrouve==itrTrouveDer){
cout<<"Il y a une seule occurrence du motif en ";
cout<<itrTrouve-itrDebut<<endl;
}
else {
cout<<endl<<"Il y a plusieurs occurrences du motif 3 21 30"
<<endl;
cout<<" - La 1ere occurrence est en ";
cout<<itrTrouve-itrDebut<<endl;
cout<<" - Derniere occurrence est en ";
cout<<itrTrouveDer-itrDebut<<endl;
}
return 0;
}
Résultat de l’exécution
Premiere occurrence d'un nombre impair en 2
Premiere occurrence 4-4-4 est en 4
Doublon en 0 Valeurs 12-12
Doublon en 4 Valeurs 4-4
Doublon en 5 Valeurs 4-4
Il y a plusieurs occurrences du motif 3 21 30
- La 1ere occurrence est en 2
- Derniere occurrence est en 7
4.4 Position pour insérer une valeur dans une séquence triée : lower_bound(),
upper_bound(), equal_range()
La fonction lower_bound() renvoie la première position pour insérer une valeur d’une séquence triée sans
modifier l’ordre.
• itrForward lower_bound(itrForward prem, itrForward der, const T &valeur);
• itrForward lower_bound(itrForward prem, itrForward der, const T &valeur,
compare c);
La fonction l'algorithme upper_bound() renvoie la dernière position pour insérer une valeur d’une séquence triée
sans modifier l’ordre. Un motif est une séquence d’objets caractérisée par leur valeur.
•
•
itrForward upper_bound(itrForward prem, itrForward der, const T &valeur);
itrForward upper_bound(itrForward prem, itrForward der, const T &valeur,
compare c);
La fonction equal_range() renvoie une paire d'itérateurs de la première et la dernière de position pour insérer
une valeur d’une séquence triée sans modifier l’ordre.
David Saint-Mellion
page 11/18
Langage C++
•
•
STL - Les fonctions algorithmes
05/02/03
equal_range(itrForward prem, itrForward der, const T &valeur);
equal_range(itrForward prem, itrForward der, const T &valeur, compare comp);
Exemple 9 : Insérer une valeur dans une séquence triée
#include <iostream>
#include <algorithm>
#include <functional>
// pour ptr_fun
using namespace std;
int afficher(int val){
// Affiche val
cout<<val<<" ";
return 0;
}
int main(void){
int source[10]={ 2,5,6,7,7,9,11,11,11,17};
int val=7;
pair<int *,int *> intervalle; //Définit une variable paire
for_each(source,source+10,ptr_fun(&afficher));
cout << endl;
// Positions possibles d'insertion de 7
intervalle.first=lower_bound(source,source+10,val);
intervalle.second=upper_bound(source,source+10,val);
cout<<val<<" insertion ["<<intervalle.first-source<<" "
<<intervalle.second-source<<"]"<<endl;
// Positions possibles d'insertion de 11
intervalle=equal_range(source,source+10,11);
cout<<"11"<<" insertion ["<<intervalle.first-source<<" "
<<intervalle.second-source<<"]"<<endl;
return 0;
}
Résultat de l’exécution
2 5 6 7 7 9 11 11 11 17
7 insertion [3 5]
11 insertion [6 9]
5 OPÉRATIONS D'ORDONNANCEMENT
5.1 Trier tous les objets : sort(), stable_sort(), partial_sort()
Les opérations de tri s'appuient la manipulation des tas. La fonction sort() trie une séquence dans l'ordre
croissant. La fonction stable_sort() trie dans l'ordre croissant, par contre les objets égaux sont maintenus dans
l'ordre initial. Il est possible d'utiliser un autre critère, en spécifiant une fonction binaire en troisième paramètre.
• void sort(itrRandomAccess prem, itrRandomAccess der);
• void sort(itrRandomAccess prem, itrRandomAccess der, compare c);
• void stable_sort(itrRandomAccess prem, itrRandomAccess der);
• void stable_sort(itrRandomAccess prem, itrRandomAccess compare c);
5.2 Trier partiellement les objets : partial_sort()
La fonction partial_sort() trie partiellement d'une séquence. La fonction partial_sort_copy() copie le résultat du tri
partiel dans une autre séquence.
• void partial_sort(itrRandomAccess prem, itrRandomAccess pivot, itrRandomAccess
der);
• itrRandomAccess partial_sort_copy(itrInput prem,itrInput der, itrRandomAccess
debut_resultat, itrRandomAccess fin_resultat);
• void partial_sort(itrRandomAccess prem, itrRandomAccess fin_tri,
itrRandomAccess der, compare c);
• itrRandomAccess partial_sort_copy(itrInput prem, itrInput der, itrRandomAccess
debut_resultat, itrRandomAccess fin_resultat, compare c);
David Saint-Mellion
page 12/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
5.3 Inverser l’ordre des objets : reverse()
La fonction reverse() inverse l’ordre de tri. La fonction reverse_copy() copie le résultat du trie inverse dans une
autre séquence. (La fonction sort() trie dans ordre croissant)
•
void reverse(itrBidirectional prem, itrBidirectional dern);
• itrOutput reverse_copy(itrBidirectional prem, itrBidirectional der, ItrOutput
destination);
5.4 Mélanger les objets : random_shuffle()
La fonction random_shuffle() mélange les objets d'une séquence.
• void random_shuffle(ItrRandomAccess prem, ItrRandomAccess der);
Exemple 10 : Trie, trie partiel, inverse mélange
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
// data source
int source[10]={2,3,7,5,4,1,8,0,9,6};
int main(void) {
vector<int> data(source, source+10);
ostream_iterator<int> ecran(cout," "); // itérateur adaptateur pour afficher
cout<<"Data origine"<< endl<<'\t';
copy(data.begin(),data.end(),ecran);
cout << endl;
sort(data.begin(),data.end());
// Trie par ordre croissant
cout<<"Data TRIE"<< endl<<'\t';
copy(data.begin(),data.end(),ecran);
cout << endl;
reverse(data.begin(),data.end());
// Trie dans l'ordre inverse
cout<<"Data TRIE en inverse"<< endl<<'\t';
copy(data.begin(),data.end(),ecran);
cout << endl;
cout<<"Data MELANGE"<< endl<<'\t';
// Mélange
random_shuffle(data.begin(),data.end());
copy(data.begin(),data.end(),ecran);
cout << endl;
// Trie par ordre croissant des 4 premiers objets
cout<<"Data TRIE partiel des 4 1ere"<< endl<<'\t';
partial_sort(data.begin(),data.begin()+4,data.end());
copy(data.begin(),data.end(),ecran);
cout << endl;
return 0;
}
Résultat de l’exécution
Data origine
2 3 7 5 4 1 8 0 9 6
Data TRIE
0 1 2 3 4 5 6 7 8 9
Data TRIE en inverse
9 8 7 6 5 4 3 2 1 0
Data MELANGE
5 6 9 7 3 2 1 0 4 8
Data TRIE partiel des 4 1ere
0 1 2 3 9 7 6 5 4 8
David Saint-Mellion
page 13/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
6 OPÉRATIONS DE COMPARAISON DE 2 SÉQUENCES
6.1 Tester l’égalité de contenu : equal()
La fonction equal() est la fonction de base. Elle compare deux séquences. Elle retourne la valeur true si les
deux séquences sont identiques. Il peut être spécifié une fonction binaire. Elle permet de tester uniquement
l'égalité de deux objets.
• bool equal(itrInput prem1, itrInput der1, itrInput prem2);
• bool equal(itrInput prem1, itrInput der1, itrInput prem2, predicateBinaire p);
6.2 Rechercher les objets dichotomiques (différents) : mismatch()
La fonction mismatch() renvoie la première position où les valeurs de deux séquences diffèrent. La valeur de
retour est une paire d’itérateurs : Si le contenu est différent la paire référence les deux objets différents dans
chaque séquence. Si le contenu est identique, la paire vaut itérateur dernier de chaque séquence.
• pair<itrInput1, itrInput2> mismatch(itrInput prem1, itrInput der1, itrInput
prem2);
• pair<itrInput1, itrInput2> mismatch(itrInput prem1, itrInput der1, itrInput
prem2, predicateBinaire p);
6.3 Tester l’infériorité - Comparaison lexicographique : lexicographical_compare()
La fonction lexicographical_compare() détermine si une séquence est inférieure à une autre séquence selon la
relation d'ordre lexicographique. L'ordre lexicographique est celui utilisé par le dictionnaire. Les objets sont
examinés un à un dans leur ordre d'apparition et la comparaison s'arrête dès que deux objets différents. La
valeur de retour vaut true si la première séquence est strictement plus petite que la deuxième. S’il y a égalité
totale, la plus petite est celle qui contient le moins d'objets.
• bool lexicographical_compare(itrInput prem1, itrInput der1, itrInput prem2,
itrInput der2);
• bool lexicographical_compare(itrInput prem1, itrInput der1, itrInput prem2,
itrInput der2, compare c);
Exemple 11 : Comparer 2 conteneurs
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
// Data source
int source[10]={15,61,33,77,18,9,12,81,3,20};
int main(void) {
int tab[10] = {15,61,33,7,18,9,1200,81,3,20};
// Déclare et intialise le vecteur d'entiers
vector<int> vec(source, source+10);
// Déclare une variable paire :
//
- pointeur d'entier
//
- itérateur vector d'entier
pair<int*, vector<int>::iterator> positions;
// Teste si le tableau est égale au vecteur
if (equal(tab,tab+10,vec.begin()))
cout<<"Le contenu du tableau est identique a celui du vecteur"<<endl;
else{
// Recherche la première position où il y a différence
positions=mismatch(tab,tab+10,vec.begin());
// Affiche les différences
cout<<"La 1ere difference entre le tableau et le vecteur :"<<endl
<<'\t'<<"tab["
<<(positions.first-tab)<<"] vaut "
<<*positions.first<<endl;
cout<<'\t'<<"vec["
<<(positions.second-vec.begin())<<"] vaut "
David Saint-Mellion
page 14/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
<<*positions.second<<endl;
// Compare le contenu du tableau et du vecteur
if (lexicographical_compare(tab,tab+10,vec.begin(),vec.end()))
cout<<"- Le tableau est plus petit le vecteur"<<endl;
else
cout<<"- Le tableau est plus grand que le vecteur"<<endl;
}
return 0;
}
Résultat de l’exécution
La 1ere difference entre le tableau et le vecteur :
tab[3] vaut 7
vec[3] vaut 77
- Le tableau est plus petit le vecteur
7 LES OPÉRATIONS ENSEMBLISTES SUR 2 SÉQUENCES
Les opérations ensemblistes sur 2 séquences permettent de :
• Tester l'inclusion d'une séquence dans une autre,
• Réaliser l’intersection : la sélection des objets communs, la fusion : le regroupement de tous objets,
l’union : la sélection des objets qui ne sont pas communs, la différence : la sélection des objets n’appartenant
qu’à une séquence.
Les fonctions set_xxx() prennent en compte la valeur des objets mais aussi l’ordre dans les séquences. Voir
exemple ci-dessous.
Opération
Intersection
Fusion
Union
Différence
Différence symètrique
Fonction
set_intersection()
merge()
set_union ()
set_difference()
set_symmetric_difference()
Séquence 1
1, 2, 3, 4
1, 2, 3, 4
1, 2, 3, 4
1, 2, 3, 4
1, 2, 3, 4
Séquence 2
3, 4, 2, 5
3, 4, 2, 5
3, 4, 2, 5
3, 4, 2, 5
3, 4, 2, 5
Résultat
3, 4
1, 2, 3, 4, 3, 4, 2, 5
1, 2, 3, 4, 2, 5
1, 2
1, 2, 2, 5
7.1 Vérifier l’inclusion d’une séquence dans une autre
La fonction includes() vérifie que toutes les valeurs d’une séquence sont dans une autre séquence. Un objet est
considéré présent dans une séquence s'il existe au moins un objet qui lui est identique. Une fonction binaire
peut être utilisée. La valeur retournée est true si tous les objets de la deuxième séquence sont également
présents dans la première séquence.
• bool includes(itrInput prem1, itrInput der1, itrInput prem2, itrInput der2);
• bool includes(itrInput prem1, itrInput der1, itrInput prem2, itrInput der2,
compare c);
7.2 Effectuer l’intersection de 2 séquences : set_intersection()
La fonction set_intersection() crée une copie de tous les objets de première séquence qui font également partie
de la seconde. Une fonction binaire peut être utilisée pour définir une autre relation que l'égalité.
• itrOutput set_intersection(itrInput prem1, itrInput der1, itrInput prem2,
itrInput der2, itrOutput destination);
• itrOutput set_intersection(itrInput prem1, itrInput der1, itrInput prem2,
itrInput der2, itrOutput destination, compare c);
7.3 Fusionner 2 séquences : merge()
La fonction merge() réalise la fusion des 2 séquences en créant une copie des objets des 2 séquences. La
séquence résultat est constituée par la concaténation des 2 séquences. Le nombre d'objets du résultat est égal
à la somme des nombres des objets des 2 séquences.
• itrOutput merge(itrInput prem1, itrInput der1, itrInput prem2, itrInput der2,
itrOutput destination);
• itrOutput merge(itrInput prem1, itrInput der1, itrInput itrOutput destination,
compare c);
David Saint-Mellion
page 15/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
7.4 Faire l’union de 2 séquences : set_union ()
La fonction set_union () crée une copie de l’union des 2 séquences. Les objets équivalents ne sont copiés qu’en
un exemplaire. La séquence résultat est constituée par la concaténation des objets de la première séquence et
de ceux qui sont différents de la seconde.
• itrOutput set_union(itrInput prem1, itrInput der1, itrInput prem2, itrInput
der2, itrOutput destination);
• itrOutput set_union(itrInput prem1, itrInput der1,
itrInput prem2, itrInput
der2, itrOutput destination,
compare c);
7.5 Fusionner au sein d’une séquence : inplace_merge()
La fonction inplace_merge() fusionne 2 séquences triées d'un conteneur.
•
void inplace_merge(itrBidirectional prem, itrBidirectional separation,
itrBidirectional der);
• void inplace_merge(itrBidirectional prem, itrBidirectional separation,
itrBidirectional der, compare c);
7.6 Etablir la différence de 2 séquences : set_difference(), set_ symmetric_difference()
La fonction set_difference() crée une copie des objets appartenant seulement à la première séquence.
• itrOutput set_difference( itrInput prem1, itrInput der1, itrInput prem2,
itrInput der2, itrOutput destination);
• itrOutput set_difference( itrInput prem1, itrInput der1, itrInput prem2,
itrInput der2, itrOutput destination,
compare c);
La fonction set_ symmetric_difference() crée une copie de l’union des différences en rassemblant les objets
appartenant seulement à la première séquence et seulement la deuxième séquence.
• itrOutput set_symmetric_difference( itrInput prem, itrInput der, itrInput prem,
itrInput der2, itrOutput destination);
• itrOutput set_symmetric_difference( itrInput prem1, itrInput der1, itrInput
prem2, itrInput der2, itrOutput destination,
compare c);
Exemple 12 : Opérations ensemblistes
#include <iostream>
#include <string>
#include <functional>
#include <algorithm>
#include <vector>
#include <list>
using namespace std;
// pour string
// pour ptr_fun
bool paritePaire(int val){
return (val&0x00000001)==0;
}
void affiche(string str1, string str2, bool val){
if (val)
cout<<str1<<" contient "<<str2<<endl;
else
cout<<str1<<" ne contient pas "<<str2<<endl;
}
// Data source
int source1[8]={2,10,16,19,20,20,77,77};
int source2[10]={77,77,67,52,20,20,19,16,10,2};
int main(void){
int data[10]={80,81,96,97,0,82,89,90,90,97};
int tab[3]={16,20,77};
vector<int> vec(source1, source1+8);
David Saint-Mellion
page 16/18
Langage C++
STL - Les fonctions algorithmes
05/02/03
list<int> liste(source2, source2+10);
vector<int> dest(18);
vector<int>::iterator itrDer=NULL; // Définit un itr pour un vector de int
ostream_iterator<int> ecran(cout," ");
// Teste l'inclusion et affiche le résultat
affiche("vec","liste",includes(vec.begin(),vec.end(),
liste.begin(),liste.end()));
affiche("vec","tab",includes(vec.begin(),vec.end(),tab,tab+3));
affiche("liste","tab",includes(liste.begin(),liste.end(),tab,tab+3));
// Effectue l'intersection de vec et de liste
itrDer=set_intersection(vec.begin(),vec.end(),
liste.begin(),liste.end(),dest.begin());
cout<<endl<<"Intersection de vec et de liste "<<endl<<"\t";
copy(dest.begin(),itrDer,ecran);
// Effectue l'union de vec et de liste
itrDer=set_union(vec.begin(),vec.end(),liste.begin(),
liste.end(),dest.begin());
cout<<endl<<"Union de vec et de liste "<<endl<<"\t";
copy(dest.begin(),itrDer,ecran);
// Effectue l'union de vec et de liste
itrDer=merge(vec.begin(),vec.end(),liste.begin(),liste.end(),
dest.begin());
cout<<endl<<"Fusion de vec et de liste "<<endl<<"\t";
copy(dest.begin(),itrDer,ecran);
// Effectue la différence de vec et de liste
itrDer=set_difference(vec.begin(),vec.end(),
liste.begin(),liste.end(),dest.begin());
cout<<endl<<"Difference de vec et de liste "<<endl<<"\t";
copy(dest.begin(),itrDer,ecran);
// Effectue la différence symétrique de vec et de liste
itrDer=set_symmetric_difference(vec.begin(),vec.end(),
liste.begin(),liste.end(),dest.begin());
cout<<endl<<"Difference symetrique de vec et de liste "<<endl<<"\t";
copy(dest.begin(),itrDer,ecran);
// Partitionne avec : critère "Nombre pair"
itrDer=partition(vec.begin(),vec.end(),ptr_fun(&paritePaire));
cout<<endl<<"Partitionne vec : critere-Nombre pair"<<endl<<"\t";
copy(vec.begin(),itrDer,ecran);
cout<<endl;
// Effectue la réunion des 2 séquences de data. Séparation au 4ème
inplace_merge(data,data+4,data+10);
cout<<"Reunion des 2 sequences de data"<<endl<<"\t";
copy(data,data+10,ecran);
cout<<endl;
return 0;
}
data : 80,81,96,97,0,82,89,90,90,97
vec : 2,10,16,19,20,20,77,77
liste : 77,77,67,52,20,20,19,16,10,2
tab : 16,20,77
Résultat de l’exécution
// vec ne contient pas liste
// vec contient tab
// liste ne contient pas tab
//
// Intersection de vec et de liste
//
77 77
// Union de vec et de liste
//
2 10 16 19 20 20 77 77 67 52 20 20 19 16 10 2
David Saint-Mellion
page 17/18
Langage C++
//
//
//
//
//
//
//
//
//
//
STL - Les fonctions algorithmes
05/02/03
Fusion de vec et de liste
2 10 16 19 20 20 77 77 77 77 67 52 20 20 19 16 10 2
Difference de vec et de liste
2 10 16 19 20 20
Difference symetrique de vec et de liste
2 10 16 19 20 20 67 52 20 20 19 16 10 2
Partitionne vec : critere-Nombre pair
2 10 16 20 20
Reunion des 2 sequences de data
0 80 81 82 89 90 90 96 97 97
7.7 Partitionner une séquence selon un critère : partition(), stable_partition()
La fonction partition() sépare les objets d'une séquence en deux sous-ensembles selon un critère. Les objets
vérifiant ce critère sont placés en tête, et les objets qui ne le vérifient pas sont placés à la fin. Les paramètres
sont les itérateurs référençant la séquence à partitionner, une fonction unaire déterminant si un objet vérifie le
critère de partitionnement. La valeur de retour est un itérateur repérant la position de la séparation entre les
deux sous-ensembles.
• itrForward partition(itrForward prem, itrForward der, predicate p);
L'opération de partitionnement avec partition() n'est pas stable : l'ordre relatif des objets de même valeur et sur
lesquels le prédicat du critère de partitionnement donne le même résultat n'est pas conservé.
La fonction stable_partition() garantit l'ordre relatif des objets au sein des sous-ensembles générés par
l'opération de partitionnement. C’est algorithme est plus complexe donc il mobilise plus de ressources.
•
itrForward stable_partition(itrForward prem, itrForward der, predicate p);
8 TABLE DES EXEMPLES DE CODE
Exemple 1 : Copier et afficher ........................................................................................................................... 3
Exemple 2 : Initialiser et échanger des objets .................................................................................................... 4
Exemple 3 : Supprimer des objets ..................................................................................................................... 5
Exemple 4 : Rechercher et remplacer des objets............................................................................................... 6
Exemple 5 : Parcourir et traiter les objets d’une séquence ................................................................................. 7
Exemple 6 : Compter des objets d’une séquence .............................................................................................. 8
Exemple 7 : Rechercher la position du Maxi et du Mini ...................................................................................... 9
Exemple 8 : Rechercher de positions - Occurrence et doublon ........................................................................ 10
Exemple 9 : Insérer une valeur dans une séquence triée................................................................................. 12
Exemple 10 : Trie, trie partiel, inverse mélange ............................................................................................... 13
Exemple 11 : Comparer 2 conteneurs.............................................................................................................. 14
Exemple 12 : Opérations ensemblistes............................................................................................................ 16
David Saint-Mellion
page 18/18

Documents pareils