category | properties | valid expressions |
all categories | copy-constructible, copy-assignable and destructible | X b(a); b = a; |
Can be incremented | ++a, a++ |
Input | Supports equality/inequality comparisons | a == b; a != b; |
Can be dereferenced as an rvalue | *a; a->m; |
Output | Can be dereferenced as an lvalue (only for mutable iterator types) | *a=t; *a++=t; |
Forward (+I+O) | default-constructible | X a; X(); |
Multi-pass: neither dereferencing nor incrementing affects dereferenceability | { b=a; *a++; *b; } |
Bidirectional (+F) | Can be decremented | --a; a--; *a--; |
Random Access (+B) | Supports arithmetic operators + and - | a + n; n + a; a - n; a - b; |
Supports inequality comparisons (<, >, <= and >=) between iterators | a < b; a > b; a <= b; a >= b; |
Supports compound assignment operations += and -= | a += n a -= n |
Supports offset dereference operator ([]) | a[n] |
]
---
class: center, middle, inverse
##Le concept de conteneur
---
.left-column[
##Le concept de conteneur
]
.right-column[
- Ils peuvent contenir des éléments copiables ou *movables*
- La plupart ont une politique d'allocation
- Ils ne peuvent contenir des éléments constants
- Les algorithmes travaillent avec des itérateurs et non des conteneurs.
- Du point de vue des algorithmes, tout ce qui peut fournir un itérateur de début et de fin est un conteneur.
- Dans le C++98, on utilisait la méthode membre begin et end pour avoir les itérateurs.
```C++
for(auto iter = c.begin(), iter_end = c.end();
iter != iter_end;
++iter)
std::cout << *iter;
```
]
---
.left-column[
##Le concept de conteneur
#### Avec C++11
]
.right-column[
- C++11 ajoute std::begin et std::end pour obtenir les itérateurs de début et de fin.
```C++
for(auto iter = begin(c), iter_end = end(c);
iter != iter_end;
++iter)
std::cout << *iter;
```
- C++11 ajoute "range-based for loop" qui utilise std::begin et std::end.
```C++
for(auto value: container)
std::cout << *iter;
```
- Donc, depuis C++11, un conteneur C++ doit implémenter std::begin et std::end.
]
---
.left-column[
##Le concept de conteneur
#### Avec C++11
###Les catégorie de conteneurs
]
.right-column[
||
|---|---
|Container|Structure de donnée qui permet l’accès aux éléments par un itérateur
|Reversible|Utilise des itérateurs bidirectionnels
|AllocatorAware (C++11)|Utilise une politique l'allocation (std::allocator)
|Sequence|Stock les éléments dans l'ordre d'insertion
|Contiguous (C++17)|Ces éléments sont contigus en mémoire
|Associative|Associe une clé aux valeurs
|UnorderedAssociative (C++11)|Associe une clé aux valeurs, mais ne trie pas les élément
]
---
class: center, middle, inverse
##Quelques conteneurs
---
.left-column[
##Quelques conteneurs
###array
]
.right-column[
- Accès par index
- Taille fixe, défini à la compilation
- Éléments contigus en mémoire
- Random-access iterator
- Insertion/suppression impossible
- Allocation très rapide
- Très proche des tableaux statiques C, mais permet des vérifications à l’exécution.
- Permet des vérifications d'index à la compilation (std::get