Programmation en C++ Standard Library Chaînes (Strings) Conteneurs
Organisation Le bibliothèque standard SL est organisée en plusieurs parties. STL (Standard Template Library): Conteneurs Itérateurs Algorithmes Chaînes de caractères (Strings) Flots (Streams) Déjà expliqué dans la présentation précédente Numériques Internationalisation Ne seront pas expliquées dans ce cours
Strings Les classes de String nous permettent d'utiliser les chaînes de caractères comme les types normaux qui ne causent pas de problèmes pour l'utilisateur Différent des "string ordinaires" de type char * ou const char * Copie, l'affectation et les fonctions de comparaison, comme pour les types fondamentaux, sont déjà disponibles - sans se soucier de corruption de la mémoire Défini dans l'« header » <string> Type: std::string - la chaîne de caractères de type char
Opérations avec String Affectation ('assignment, operator ='): Taille de string ('size') : Recherche dans une chaîne ('find'): Conversion en C-string (char *): std::string s = "abcd"; std::string t = s; t += “efgh”; std::string s = "abcd"; int size = s.size(); std::string s = "abcd"; int pos = s.find("bc"); std::string s = "abcd"; char* cs = s.c_str();
STL STL = Standard Template Library Le cœur de SL Fournit une variété de classes de conteneur que répond à des besoins différents, avec plusieurs algorithmes qui fonctionnent sur eux Les programmeurs peuvent oublier la programmation des tableaux dynamiques, des algorithmes de recherche etc Il suffit de choisir le conteneur approprié et d'appeler ses méthodes pour le traitement des données Tous les composants sont des patrons ('templates') Peuvent être utilisés avec des types arbitraires Extrêmement efficace La coopération des différentes composantes est bien-structurée : Les conteneurs, itérateurs et algorithmes
Conteneurs Gérent une collection d'éléments Ordonnés ('Sequence') = collections ordonnées dans lesquelles chaque élément a une certaine position (indépendante de la valeur) Vecteur ('vector') : 1 dimensional array Liste ('list'): liste doublement chainée Associative = collections triés (la position réelle d'un élément dépend de sa valeur) Set / Multiset: Élément classés en fonction de leur propre valeur Map / Multimap: Les éléments sont paires clé / valeur, classés en fonction de valeur de la clé
Vector Dans le 'header' <vector> Type: std::vector<T> - où T est le type d'élément Des fonctions utiles: push_back(elem) Ajouter un élément à la fin at(idx) ou [idx] Retour de idx-ème élément front(), back() Retour de le premier, le dernier élément size() Retour de la taille de vecteur clear() Supprimer tous les éléments #include <iostream> #include <vector> int main () { std::vector<int> myVector; myVector.push_back(3); myVector.push_back(4); std::cout << myVector[0] << std::endl; myVector.at(1) = 5; std::cout << myVector.back() << std::endl; myVector.clear(); return 0; }
List Dans le 'header' <list> Type: std::list<T> - où T est le type d'élément Des fonctions utiles: push_front(elem), push_back(elem) Ajouter un élément au début, à la fin pop_front(), pop_back() Enlever l'élément au début, à la fin front(), back(), size(), clear() Même comme pour vector #include <iostream> #include <list> int main () { std::list<int> myList; myList.push_front(3); myList.push_front(2); myList.push_back(4); myList.pop_front(); myList.pop_back(); std::cout << myList.front() << std::endl; std::cout << myList.back() return 0; } Certaines méthodes sont communes à la fois au vecteur et a la liste (et aussi aux autres conteneurs): size (), clear (), ...
Itérateurs Itérateur ('iterator') = objet qui peut "parcourir" (naviguer parmi) les éléments Il représente une certaine position dans un conteneur Tous les conteneurs fournissent les mêmes fonctions de base qui permettent aux itérateurs de naviguer parmi leurs éléments Les fonctions définies pour tous les conteneurs: begin(), end() Retour d'un itérateur, qui représente le commencement, la fin des éléments dans le conteneur. La fin est la position derrière le dernier élément v.begin() v.end() T vector it
Itérateurs L'« header »: Tous les conteneurs définissent leur propre type d'itérateur, il n'y a pas d '« header » spécial pour l'utilisation des itérateurs Types: container_type::iterator container_type::const_iterator Opérations de base: Operator * Renvoie l'élément de la position actuelle Operator ++ Permet à l'itérateur de passer à un autre élément Operators == and != Renvoie le résultat si deux itérateurs représentent la même position ou non Operator = Attribuer un itérateur (la position de l'élément auquel il se réfère)
Itérateurs - Exemple #include <iostream> #include <vector> int main() { std::vector<int> myVector; // ... fill the vector here // Iterating over vector elements std::vector<int>::iterator it; for ( it = myVector.begin(); it != myVector.end(); ++it ) { int i = *it; std::cout << "i = " << i << std::endl; } return 0;
Quand utiliser le quel conteneur Vector Par défaut, vous devez utiliser un vecteur Si vous avez besoin d'accéder au N-ème élément L'insertion et le retrait peuvent être coûteux Très efficace lorsque vous naviguez sur le conteneur List Si vous avez souvent besoin d'insérer ou de retirer un élément en plein milieu du conteneur L'insertion a lieu à temps constant L'accès au N-ème élément par itération à partir du 1er Map Si vous avez besoin d'un élément via une clé Une liste triée maintenue lors de l'insertion de nouveaux éléments Liste associative