Go to file
2025-10-02 10:15:17 +02:00
containers clean and done? 2022-11-29 19:10:30 +01:00
tests clean and done? 2022-11-29 19:10:30 +01:00
ft_containers.hpp clean and done? 2022-11-29 19:10:30 +01:00
main.cpp tester almost done 2022-11-29 14:48:02 +01:00
Makefile 2 binary 2022-11-29 15:31:23 +01:00
README.md docs: add detailed README for STL containers implementation 2025-10-02 10:15:17 +02:00

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

git clone <repository-url>
cd ft_containers

2. Compiler les tests

make

3. Exécuter les tests

./ft_containers

4. Tests de performance

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

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

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

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