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

  1. Which iterator category does std::list support?
  2. What makes an iterator contiguous?
Show answers
  1. Bidirectional.
  2. Elements are stored contiguously in memory and iterator is pointer-like.

Exercises

  1. Write a function that checks at compile time if an iterator is random access (use concepts or type traits).
  2. Demonstrate iterator invalidation rules for vector vs list when erasing.