docs: add detailed README for STL containers implementation
This commit is contained in:
parent
6655f996b6
commit
25f7408158
187
README.md
Normal file
187
README.md
Normal file
@ -0,0 +1,187 @@
|
||||
# ft_containers
|
||||
|
||||
## Description
|
||||
ft_containers est un projet de l'École 42 qui consiste à ré-implémenter plusieurs conteneurs de la STL (Standard Template Library) de C++. Ce projet permet de comprendre en profondeur le fonctionnement interne des conteneurs et des itérateurs.
|
||||
|
||||
## Objectifs pédagogiques
|
||||
- Maîtriser la **programmation générique** en C++
|
||||
- Comprendre l'implémentation des **structures de données**
|
||||
- Implémenter des **itérateurs** conformes aux standards
|
||||
- Respecter les **spécifications STL**
|
||||
- Optimiser les **performances** des algorithmes
|
||||
|
||||
## Conteneurs implémentés
|
||||
|
||||
### Vector
|
||||
- Tableau dynamique redimensionnable
|
||||
- Accès aléatoire en O(1)
|
||||
- Insertion/suppression en fin en O(1) amorti
|
||||
- Support complet des itérateurs
|
||||
|
||||
### Map
|
||||
- Conteneur associatif ordonné (Red-Black Tree)
|
||||
- Recherche, insertion, suppression en O(log n)
|
||||
- Itérateurs bidirectionnels
|
||||
- Ordre basé sur les clés
|
||||
|
||||
### Stack
|
||||
- Adaptateur de conteneur (LIFO)
|
||||
- Basé sur un conteneur sous-jacent (vector par défaut)
|
||||
- Opérations push, pop, top
|
||||
|
||||
### Set (Bonus)
|
||||
- Conteneur d'éléments uniques ordonnés
|
||||
- Même structure interne que map
|
||||
- Itérateurs bidirectionnels
|
||||
|
||||
## Technologies utilisées
|
||||
- **C++98** (standard imposé par 42)
|
||||
- **Templates** pour la généricité
|
||||
- **STL allocators** custom
|
||||
- **Red-Black Tree** pour map/set
|
||||
- **SFINAE** pour la métaprogrammation
|
||||
|
||||
## Fonctionnalités clés
|
||||
|
||||
### Itérateurs
|
||||
- **Iterator traits** complets
|
||||
- **Random access iterators** (vector)
|
||||
- **Bidirectional iterators** (map/set)
|
||||
- **Reverse iterators** pour tous les conteneurs
|
||||
|
||||
### Allocateurs
|
||||
- Support des **allocateurs personnalisés**
|
||||
- Gestion mémoire optimisée
|
||||
- Compatible STL allocator
|
||||
|
||||
### Comparateurs
|
||||
- **Foncteurs de comparaison** personnalisables
|
||||
- Support des types de base et classes
|
||||
- Optimisation pour les types triviaux
|
||||
|
||||
## Installation et compilation
|
||||
|
||||
### 1. Cloner le projet
|
||||
```bash
|
||||
git clone <repository-url>
|
||||
cd ft_containers
|
||||
```
|
||||
|
||||
### 2. Compiler les tests
|
||||
```bash
|
||||
make
|
||||
```
|
||||
|
||||
### 3. Exécuter les tests
|
||||
```bash
|
||||
./ft_containers
|
||||
```
|
||||
|
||||
### 4. Tests de performance
|
||||
```bash
|
||||
make test_performance
|
||||
```
|
||||
|
||||
## Structure du projet
|
||||
```
|
||||
ft_containers/
|
||||
├── Makefile # Compilation
|
||||
├── main.cpp # Tests principaux
|
||||
├── ft_containers.hpp # Header principal
|
||||
├── containers/ # Implémentations
|
||||
│ ├── vector.hpp
|
||||
│ ├── map.hpp
|
||||
│ ├── stack.hpp
|
||||
│ └── set.hpp # Bonus
|
||||
├── iterators/ # Itérateurs
|
||||
│ ├── iterator_traits.hpp
|
||||
│ ├── reverse_iterator.hpp
|
||||
│ └── random_access_iterator.hpp
|
||||
├── utils/ # Utilitaires
|
||||
│ ├── pair.hpp
|
||||
│ ├── make_pair.hpp
|
||||
│ ├── equal.hpp
|
||||
│ ├── lexicographical_compare.hpp
|
||||
│ └── enable_if.hpp
|
||||
└── tests/ # Fichiers de test
|
||||
```
|
||||
|
||||
## Utilisation
|
||||
|
||||
### Vector
|
||||
```cpp
|
||||
ft::vector<int> vec;
|
||||
vec.push_back(42);
|
||||
vec.push_back(21);
|
||||
|
||||
for (ft::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it)
|
||||
std::cout << *it << std::endl;
|
||||
```
|
||||
|
||||
### Map
|
||||
```cpp
|
||||
ft::map<std::string, int> map;
|
||||
map["answer"] = 42;
|
||||
map["half"] = 21;
|
||||
|
||||
ft::map<std::string, int>::iterator it = map.find("answer");
|
||||
if (it != map.end())
|
||||
std::cout << it->second << std::endl;
|
||||
```
|
||||
|
||||
### Stack
|
||||
```cpp
|
||||
ft::stack<int> stack;
|
||||
stack.push(42);
|
||||
stack.push(21);
|
||||
|
||||
while (!stack.empty()) {
|
||||
std::cout << stack.top() << std::endl;
|
||||
stack.pop();
|
||||
}
|
||||
```
|
||||
|
||||
## Tests et validation
|
||||
|
||||
### Tests de conformité
|
||||
- Comparaison avec la **STL originale**
|
||||
- Tests de **performance**
|
||||
- Validation des **edge cases**
|
||||
- Tests de **compilation** avec différents types
|
||||
|
||||
### Outils de test
|
||||
- **Unit tests** complets
|
||||
- **Memory leak detection**
|
||||
- **Performance benchmarks**
|
||||
- **Stress tests**
|
||||
|
||||
## Complexités respectées
|
||||
|
||||
| Conteneur | Opération | Complexité |
|
||||
|-----------|-----------|------------|
|
||||
| Vector | accès [] | O(1) |
|
||||
| Vector | push_back | O(1) amorti |
|
||||
| Vector | insert | O(n) |
|
||||
| Map | find/insert/erase | O(log n) |
|
||||
| Map | iteration | O(n) |
|
||||
| Stack | push/pop/top | O(1) |
|
||||
|
||||
## Normes et contraintes 42
|
||||
- **C++98** uniquement
|
||||
- Pas de **fonctions interdites**
|
||||
- Pas de **memory leaks**
|
||||
- **Orthodox Canonical Form** respectée
|
||||
- **Templates** obligatoires
|
||||
|
||||
## Compétences développées
|
||||
- Programmation générique avancée
|
||||
- Structures de données complexes
|
||||
- Optimisation mémoire et performance
|
||||
- Métaprogrammation C++
|
||||
- Debugging avancé
|
||||
|
||||
## Auteur
|
||||
Alexandre Pommier (apommier) - École 42
|
||||
|
||||
## Licence
|
||||
Projet académique - École 42
|
||||
Loading…
Reference in New Issue
Block a user