learn_stl
learn_stl copied to clipboard
Learning how the C++ Standard Library works; by implementation
Learn STL
Learning about the C++ Standard Library by Implementation
Ever wondered how std::tuple is implemented? How std::get works? Well I started implementing this to find out just that.
The standard library heavily relies on many C++ Idioms and unusual language features, by implementing the library you can get a bit more familiar with them!
Each of the components have documentation in /docs explaining how they work, what idioms the use, and whats interesting about them.
Hopefully you'll find this an interesting read!
Feel free to submit a PR adding more components or improving library / documentation!
Vocab Types
any
Any is the de-facto type-erasure method in C++, it provides type-safe container for single values of any type. The implementation provides an introduction to polymorphism in C++.
optional
How can you store an object without a default-constructor on the stack? Well with a union is how, but what is this weird special type.
tuple
Tuple heavily depends on variadic templates and std::index_sequence, and isn't obvious how its implemented. It's a refreshing look at
features which aren't used day-to-day.
variant
Another component thats heavily dependent on variadic templates, it employs more template metaprogramming tricks than tuple. It also provides an interesting use case of aligned_storage.
Containers
array
Array is deceptively simple, but how are its constructors and destructors implicity declared? Why is array constexpr but vector isn't, and what is aggregate-initialization? Understanding Array requires a strong comprehension of these often over-looked language features.
vector
Everyone knows std::vector right? But why is reserving so important? And what is std::allocator and why wrap it in std::allocator_traits?
valarray
valarray provides an introduction to expression-templates. It stores elements in a vector, and it provides element-wise unary and binary operations. It won't create any temporaries and will only perform one iteration as it evaluates the expression for each resultant element.
Memory Mangement
unique_ptr
unique_ptr is pretty simple, but its always good to understand what std::default_deleter does and how dangerous aggregate initialisation can be
addressof
addressof might seem like a verbose way of calling &T; but why does it exist? And why is it constexpr in C++17 and what does a constexpr pointer mean?
allocator
allocator is relatively simple, but why does it define is_always_equal and propagate_on_container_move_assignment.