C++ - Iterators & Iterator Categories
Overview
Estimated time: 50–70 minutes
Understand iterator categories and why they matter for algorithms and performance. Learn traits, validity rules, and contiguous iterators.
Learning Objectives
- Explain input/output, forward, bidirectional, random access, and contiguous iterators.
- Use iterator_traits and detect capabilities.
Prerequisites
Categories at a glance
- Input/Output: single-pass reading/writing.
- Forward: multi-pass; Bidirectional: ++ and --; Random access: arithmetic and indexing; Contiguous: memory-contiguous.
iterator_traits
#include
#include
#include
static_assert(std::is_same_v::iterator>::iterator_category,
std::random_access_iterator_tag>);
Contiguous iterators
#include
#include
int main(){
std::vector v{1,2,3};
std::span s(v); // view over contiguous memory
}
Common Pitfalls
- Iterator invalidation after erase/insert; know container-specific rules.
- Using output iterators for reading or reusing single-pass iterators.
Checks for Understanding
- Which iterator category does std::list support?
- What makes an iterator contiguous?
Show answers
- Bidirectional.
- Elements are stored contiguously in memory and iterator is pointer-like.
Exercises
- Write a function that checks at compile time if an iterator is random access (use concepts or type traits).
- Demonstrate iterator invalidation rules for vector vs list when erasing.