Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
collection [2016/03/27 13:30] gbdivers |
collection [2017/08/23 12:45] (Version actuelle) gbdivers |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^ | + | ^ [[nombres_aleatoires|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[map|Chapitre suivant]] ^ |
====== Le concept de collections de données ====== | ====== Le concept de collections de données ====== | ||
Ligne 62: | Ligne 63: | ||
</note> | </note> | ||
- | Il est également possible de parcourir une collection du dernier élément au premier élément en utilisant les fonctions ''rbegin'' (//reverse begin//) et ''rend'' (//reverse end//). Ces fonctions sont utilisables uniquement en fonctions membres. | + | Notez bien que même si ''std::string'' est une collection, c'est un cas particulier lorsque vous l'utilisez avec ''std::cout''. Dans ce cas, ''std::string'' n'est pas affichée comme un collection, mais bien comme une chaîne de caractères. Ce qui veut dire que dans le cas général de n'importe quelle collection, vous ne pouvez pas afficher directement son contenu avec ''std::cout''. Un code d'exemple est donné a la fin de ce chapitre pour afficher le contenu d'une collection. |
- | + | ||
- | Par exemple, il est possible de trier dans l'ordre inverse de cette manière : | + | |
<code cpp> | <code cpp> | ||
- | #include <iostream> | + | std::vector<int> v { 1, 2, 3 }; |
- | #include <string> | + | std::cout << v << std::endl; // erreur |
- | #include <algorithm> | + | |
- | + | ||
- | int main() { | + | |
- | std::string s { "azerty" }; | + | |
- | + | ||
- | std::sort(std::begin(s), std::end(s)); | + | |
- | std::cout << s << std::endl; | + | |
- | + | ||
- | std::sort(s.rbegin(), s.rend()); | + | |
- | std::cout << s << std::endl; | + | |
- | } | + | |
- | </code> | + | |
- | + | ||
- | affiche : | + | |
- | + | ||
- | <code> | + | |
- | aertyz | + | |
- | zytrea | + | |
</code> | </code> | ||
Ligne 99: | Ligne 80: | ||
<code cpp> | <code cpp> | ||
- | std::vector<int> const integers {}; | + | std::vector<int> integers {}; |
</code> | </code> | ||
Ligne 177: | Ligne 158: | ||
Par défaut, ''std::vector'' ne contient pas d'éléments lors de l'initialisation de la variable ''integers''. Comme ''std::vector'' est un tableau de taille redimensionnable, vous pourrez ajouter des éléments par la suite. | Par défaut, ''std::vector'' ne contient pas d'éléments lors de l'initialisation de la variable ''integers''. Comme ''std::vector'' est un tableau de taille redimensionnable, vous pourrez ajouter des éléments par la suite. | ||
- | Au contraire, ''std::array'' est initialisé avec cinq éléments dans le code précédent. Il est possible de créer une ''std::array'' avec aucun élément, mais comme il n'est pas possible d'ajouter des éléments, l'intérêt est limité. Cela i | + | Au contraire, ''std::array'' est initialisé avec cinq éléments dans le code précédent. Il est possible de créer une ''std::array'' avec aucun élément, mais comme il n'est pas possible d'ajouter des éléments, l'intérêt est limité. |
<note>Remarque : pour rappel, le but de ce cours n'est pas de vous présenter toutes les syntaxes possibles, mais celles qui sont utiles à connaître pour comprendre les bases du C++. Il est possible d'utiliser d'autres syntaxes pour les classes ''std::vector'' et ''std::array'', mais la compréhension de ces syntaxes nécessite des connaissances plus avancées en C++.</note> | <note>Remarque : pour rappel, le but de ce cours n'est pas de vous présenter toutes les syntaxes possibles, mais celles qui sont utiles à connaître pour comprendre les bases du C++. Il est possible d'utiliser d'autres syntaxes pour les classes ''std::vector'' et ''std::array'', mais la compréhension de ces syntaxes nécessite des connaissances plus avancées en C++.</note> | ||
Ligne 187: | Ligne 168: | ||
</code> | </code> | ||
- | On retrouve ici la différence de syntaxe entre argument template et argument de fonction. Pour ''std::array'', la taille du tableau (nombre d'éléments) est fixée à la compilation, c'est donc un argument template (entre chevrons). Pour ''std::vector'', la taille est variable durant l'exécution, c'est donc un argument de fonction (entre parenthèses). | + | On retrouve ici la différence de syntaxe entre argument //template// et argument de fonction. Pour ''std::array'', la taille du tableau (nombre d'éléments) est fixée à la compilation, c'est donc un argument //template// (entre chevrons). Pour ''std::vector'', la taille est variable durant l'exécution, c'est donc un argument de fonction (entre parenthèses). |
+ | |||
+ | <note>**Accolades et parentheses** | ||
+ | |||
+ | Remarquez bien ici l'utilisation des parenthèses au lieu des accolades, ce n'est pas une erreur de frappe. | ||
+ | |||
+ | Les accolades permettent de définir une liste de valeurs, qui seront insérées directement dans une collection. Les parenthèses permettent d'appeler un constructeur (une fonction spéciale permettant d'initialiser une classe). | ||
+ | </note> | ||
Dans les deux cas, il est possible de connaître la taille d'un tableau en utilisant la fonction membre ''size''. | Dans les deux cas, il est possible de connaître la taille d'un tableau en utilisant la fonction membre ''size''. | ||
Ligne 211: | Ligne 199: | ||
</code> | </code> | ||
- | Vous pouvez donner des valeurs entre les crochets pour initialiser le tableau. Une liste de valeurs (//initializer-list//) s'écrit entre crochets, avec des virgules comme séparateurs. | + | Vous pouvez donner des valeurs entre les accolades pour initialiser le tableau. Une liste de valeurs (//initializer-list//) s'écrit entre accolades, avec des virgules comme séparateurs. |
<code cpp> | <code cpp> | ||
Ligne 268: | Ligne 256: | ||
<note>Il existe également une collection qui permet d'être agrandie ou rétrécie depuis le premier et le dernier élément : [[http://en.cppreference.com/w/cpp/container/deque|std::deque]]. Son utilisation est assez similaire à ''std::vector'', vous verrez dans les exercices d'application comment l'utiliser.</note> | <note>Il existe également une collection qui permet d'être agrandie ou rétrécie depuis le premier et le dernier élément : [[http://en.cppreference.com/w/cpp/container/deque|std::deque]]. Son utilisation est assez similaire à ''std::vector'', vous verrez dans les exercices d'application comment l'utiliser.</note> | ||
+ | |||
===== Afficher le contenu d'une collection ===== | ===== Afficher le contenu d'une collection ===== | ||
- | Pour accéder à chaque élément individuellement, il est nécessaire de faire intervenir la notion d'itérateur et de boucles, ce qui sera vu dans la suite ce cours. Cependant, il est intéressant de voir rapidement la syntaxe permettant d'afficher le contenu d'une collection. Pour cela, vous pouvez utiliser la syntaxe suivante : | + | Pour afficher le contenu d'une collection, il n'est pas possible d'utiliser directement ''std::cout'' dessus. Il faut afficher individuellement chaque élément avec ''std::cout'', ce qui implique de voir comment parcourir une collection. Vous verrez cela dans la suite du cours, pour le moment, voici deux syntaxes pour faire cela. |
+ | |||
+ | ==== Avec un algorithme ==== | ||
+ | |||
+ | Une première solution est en fait de copier (avec l'algorithme ''std::copy'') chaque élément dans le flux de sortie standard (''std::cout''). | ||
+ | |||
+ | <code cpp main.cpp> | ||
+ | #include <iostream> | ||
+ | #include <vector> | ||
+ | #include <string> | ||
+ | #include <algorithm> | ||
+ | #include <iterator> | ||
+ | |||
+ | int main() { | ||
+ | std::vector<int> const i { 1, 2, 3, 4 }; | ||
+ | copy(begin(i), end(i), std::ostream_iterator<int>(std::cout, "\t")); | ||
+ | std::cout << std::endl; | ||
+ | |||
+ | std::vector<double> const d { 1.2, 3.4, 5.6, 7.8 }; | ||
+ | copy(begin(d), end(d), std::ostream_iterator<double>(std::cout, "\t")); | ||
+ | std::cout << std::endl; | ||
+ | |||
+ | std::vector<std::string> const s { "un", "deux", "trois", "quatre" }; | ||
+ | copy(begin(s), end(s), std::ostream_iterator<std::string>(std::cout, "\t")); | ||
+ | std::cout << std::endl; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | affiche : | ||
+ | |||
+ | <code> | ||
+ | 1 2 3 4 | ||
+ | 1.2 3.4 5.6 7.8 | ||
+ | un deux trois quatre | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ==== Avec une boucle ==== | ||
+ | |||
+ | Pour accéder à chaque élément individuellement, il est nécessaire de faire intervenir la notion d'itérateur et de boucles, ce qui sera vu dans la suite de ce cours. Cependant, il est intéressant de voir rapidement la syntaxe permettant d'afficher le contenu d'une collection. Pour cela, vous pouvez utiliser la syntaxe suivante : | ||
<code cpp> | <code cpp> | ||
Ligne 278: | Ligne 306: | ||
</code> | </code> | ||
- | Ce code se lit de la façon suivante : "pour (//for//) chaque élément d'une collection (''integers'' dans ce code), afficher la valeur avec ''cout''". Ce code est relativement générique, vous pouvez l'utiliser avec n'importe quelle collection de données dont le type peut être affiché avec ''std::cout''. | + | Ce code se lit de la façon suivante : "pour (//for//) chaque élément d'une collection (''integers'' dans ce code), afficher la valeur avec ''std::cout''". Ce code est relativement générique, vous pouvez l'utiliser avec n'importe quelle collection de données dont le type peut être affiché avec ''std::cout''. |
<code cpp main.cpp> | <code cpp main.cpp> | ||
Ligne 288: | Ligne 316: | ||
std::vector<int> const i { 1, 2, 3, 4 }; | std::vector<int> const i { 1, 2, 3, 4 }; | ||
for (auto const value: i) | for (auto const value: i) | ||
- | std::cout << value << std::endl; | + | std::cout << value << '\t'; |
std::cout << std::endl; | std::cout << std::endl; | ||
- | + | ||
std::vector<double> const d { 1.2, 3.4, 5.6, 7.8 }; | std::vector<double> const d { 1.2, 3.4, 5.6, 7.8 }; | ||
for (auto const value: d) | for (auto const value: d) | ||
- | std::cout << value << std::endl; | + | std::cout << value << '\t'; |
std::cout << std::endl; | std::cout << std::endl; | ||
- | + | ||
std::vector<std::string> const s { "un", "deux", "trois", "quatre" }; | std::vector<std::string> const s { "un", "deux", "trois", "quatre" }; | ||
for (auto const value: s) | for (auto const value: s) | ||
- | std::cout << value << std::endl; | + | std::cout << value << '\t'; |
std::cout << std::endl; | std::cout << std::endl; | ||
} | } | ||
Ligne 306: | Ligne 334: | ||
<code> | <code> | ||
- | 1 | + | 1 2 3 4 |
- | 2 | + | 1.2 3.4 5.6 7.8 |
- | 3 | + | un deux trois quatre |
- | 4 | + | |
- | + | ||
- | 1.2 | + | |
- | 3.4 | + | |
- | 5.6 | + | |
- | 7.8 | + | |
- | + | ||
- | un | + | |
- | deux | + | |
- | trois | + | |
- | quatre | + | |
</code> | </code> | ||
Ligne 329: | Ligne 346: | ||
int main() { | int main() { | ||
- | std::string const s { "hello, wolrd!" }; | + | std::string const s { "hello, world!" }; |
for (auto const value: s) | for (auto const value: s) | ||
- | std::cout << value << std::endl; | + | std::cout << value << ' '; |
} | } | ||
</code> | </code> | ||
Ligne 338: | Ligne 355: | ||
<code> | <code> | ||
- | h | + | h e l l o , w o r l d ! |
- | e | + | |
- | l | + | |
- | l | + | |
- | o | + | |
- | , | + | |
- | + | ||
- | w | + | |
- | o | + | |
- | l | + | |
- | r | + | |
- | d | + | |
- | ! | + | |
</code> | </code> | ||
- | ^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^ | + | ^ [[nombres_aleatoires|Chapitre précédent]] ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[map|Chapitre suivant]] ^ |