Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
zip_unzip [2015/10/14 11:47] gbdivers |
zip_unzip [2015/11/04 19:45] (Version actuelle) gbdivers |
||
---|---|---|---|
Ligne 4: | Ligne 4: | ||
====== Zip et unzip ====== | ====== Zip et unzip ====== | ||
- | Intentionnalités inspirées de Python (et autre langages, probablement. Cf https://docs.python.org/3.3/library/functions.html#zip). Permet de manipuler des listes. | + | Intentionnalités inspirées de Python (et autres langages, probablement. Cf https://docs.python.org/3.3/library/functions.html#zip). Permet de manipuler des listes. |
Zip : prend plusieurs listes et en crée une seule. | Zip : prend plusieurs listes et en crée une seule. | ||
- | <code> | + | <code cpp> |
const auto x = { 1, 2, 3 }; | const auto x = { 1, 2, 3 }; | ||
const auto y = { 'a', 'b', 'c' }; | const auto y = { 'a', 'b', 'c' }; | ||
Ligne 15: | Ligne 15: | ||
</code> | </code> | ||
- | Unzip : prend une liste est la sépare en plusieurs liste | + | Unzip : prend une liste et la sépare en plusieurs listes. |
- | <code> | + | <code cpp> |
const Zip z = { { 1, 'a' }, { 2, 'b' }, { 3, 'c' } }; | const Zip z = { { 1, 'a' }, { 2, 'b' }, { 3, 'c' } }; | ||
- | styd::tie(x, y) = unzip(z); | + | std::tie(x, y) = unzip(z); |
std::cout << x << std::endl; // affiche (1, 2, 3) | std::cout << x << std::endl; // affiche (1, 2, 3) | ||
std::cout << y << std::endl; // affiche (a, b, c) | std::cout << y << std::endl; // affiche (a, b, c) | ||
Ligne 27: | Ligne 27: | ||
===== Vérifier les données ===== | ===== Vérifier les données ===== | ||
- | Ecrire une fonction qui vérifie que 2 vectors ont le même nombre d'éléments, en utilisant un algorithme de la bibliothèque standard. | + | Écrire une fonction qui vérifie que deux vectors ont le même nombre d'éléments, en utilisant un algorithme de la bibliothèque standard. |
- | <code> | + | <code cpp> |
bool check_zip(vector<int> const& x, vector<char> const& y); | bool check_zip(vector<int> const& x, vector<char> const& y); | ||
</code> | </code> | ||
Ligne 35: | Ligne 35: | ||
===== Avec un algorithme standard ===== | ===== Avec un algorithme standard ===== | ||
- | Ecrire une fonction qui zip deux vector, en utilisant un algorithme de la bibliothèque standard. | + | Écrire une fonction qui zip deux vectors, en utilisant un algorithme de la bibliothèque standard. |
- | <code> | + | <code cpp> |
vector<pair<int, char>> zip1(vector<int> const& x, vector<char> const& y); | vector<pair<int, char>> zip1(vector<int> const& x, vector<char> const& y); | ||
</code> | </code> | ||
Ligne 52: | Ligne 52: | ||
===== Générique sur les types ===== | ===== Générique sur les types ===== | ||
- | Ecrire une fonction qui est générique pour les types | + | Écrire une fonction qui est générique pour les types. |
- | <code> | + | <code cpp> |
vector<pair<T, U>> zip3(vector<T> const& x, vector<U> const& y); | vector<pair<T, U>> zip3(vector<T> const& x, vector<U> const& y); | ||
</code> | </code> | ||
Ligne 60: | Ligne 60: | ||
===== Générique sur les collections ===== | ===== Générique sur les collections ===== | ||
- | Ecrire une fonction qui est générique pour les collections (en entrée uniquement ?). S'inspirer des algorithmes de la bibliothèque standard. | + | Écrire une fonction qui est générique pour les collections (en entrée uniquement ?). S'inspirer des algorithmes de la bibliothèque standard. |
- | <code> | + | <code cpp> |
void zip3(InputIterA first_x, InputIterA last_x, | void zip3(InputIterA first_x, InputIterA last_x, | ||
- | InputIterB first_y, InputIterB last_y, | + | InputIterB first_y, InputIterB last_y, |
- | OutputIter first_z); | + | OutputIter first_z); |
</code> | </code> | ||
Ligne 72: | Ligne 72: | ||
La fonction de la question précédente n'a pas la même syntaxe que les fonctions des questions avant (vector en paramètre mutable plutôt qu'en retour de fonction), par homologie avec les algorithmes standards (et pour éviter la copie). | La fonction de la question précédente n'a pas la même syntaxe que les fonctions des questions avant (vector en paramètre mutable plutôt qu'en retour de fonction), par homologie avec les algorithmes standards (et pour éviter la copie). | ||
- | Ecrire un **adaptateur** permettant de convertir le zip de la question 4 (donc sans réécrire le zip). | + | Écrire un **adaptateur** permettant de convertir le zip de la question précédente (donc sans réécrire le zip). |
- | <code> | + | <code cpp> |
vector<pair<T, U>> z = (...) zip3(x1, x2, y1, y2, z1) (...); | vector<pair<T, U>> z = (...) zip3(x1, x2, y1, y2, z1) (...); | ||
</code> | </code> | ||
Ligne 82: | Ligne 82: | ||
Utiliser des paires d'itérateurs sur chaque collection en paramètre, plutôt que des itérateurs (sauf pour la sortie). | Utiliser des paires d'itérateurs sur chaque collection en paramètre, plutôt que des itérateurs (sauf pour la sortie). | ||
- | <code> | + | <code cpp> |
void zip5(std::pair<InputIterA, InputIterA> x, | void zip5(std::pair<InputIterA, InputIterA> x, | ||
std::pair<InputIterB, InputIterB> y, | std::pair<InputIterB, InputIterB> y, | ||
Ligne 90: | Ligne 90: | ||
===== Paire d'itérateurs ===== | ===== Paire d'itérateurs ===== | ||
- | Idem, mais chaque paire représente le début ou la fin dans les 2 collections. | + | Idem, mais chaque paire représente le début ou la fin dans les deux collections. |
- | <code> | + | <code cpp> |
void zip5b(std::pair<InputIterA, InputIterB> first, | void zip5b(std::pair<InputIterA, InputIterB> first, | ||
- | std::pair<InputIterA, InputIterB> last, | + | std::pair<InputIterA, InputIterB> last, |
- | OutputIter first_z); | + | OutputIter first_z); |
</code> | </code> | ||
Ligne 106: | Ligne 106: | ||
Prendre un nombre indéfini de collections en entrée. Plusieurs approches sont possibles : | Prendre un nombre indéfini de collections en entrée. Plusieurs approches sont possibles : | ||
- | * réécrire zip5 avec std::tuple | + | * réécrire zip5 avec std::tuple ; |
- | * réécrire zip5b avec std::tuple | + | * réécrire zip5b avec std::tuple ; |
- | * prendre un seul std::tuple en paramètre, contenant successivement le début et la fin de chaque collection | + | * prendre un seul std::tuple en paramètre, contenant successivement le début et la fin de chaque collection ; |
- | * en utilisant un variadic template | + | * en utilisant un variadic template. |
+ | |||
+ | Écrire chaque approche. Laquelle préférez-vous ? | ||
- | Ecrire chaque approche. Laquelle préférez vous ? | + | Reference : [[http://www.boost.org/doc/libs/1_59_0/libs/iterator/doc/zip_iterator.html|Boost Zip Iterator]] |
Note : cette question sort des limites de ce cours. | Note : cette question sort des limites de ce cours. |