Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Iterator Categories and Traversal | Introduction
C++ STL Containers and Algorithms

bookIterator Categories and Traversal

Iterators are a fundamental part of the C++ Standard Template Library (STL), providing a consistent way to access and traverse the elements of a container. The STL defines several iterator categories, each with different capabilities:

  • Input Iterators: allow reading elements in a single-pass, forward-only manner;
  • Output Iterators: allow writing elements in a single-pass, forward-only manner;
  • Forward Iterators: support both reading and writing, and can be used for multiple passes in the forward direction;
  • Bidirectional Iterators: extend forward iterators by also supporting backward traversal;
  • Random Access Iterators: provide all the capabilities of bidirectional iterators, plus direct access to any element in constant time using arithmetic operations.

Each STL container provides iterators of a specific category, depending on its internal structure. Understanding these categories helps you choose the right algorithms and traversal techniques for each container.

main.cpp

main.cpp

copy
123456789101112131415161718192021222324252627282930313233
#include <iostream> #include <vector> #include <list> int main() { std::vector<int> v = {1, 2, 3, 4, 5}; std::list<int> l = {10, 20, 30, 40, 50}; std::cout << "Traversing std::vector (random access iterator): "; for (auto it = v.begin(); it != v.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; std::cout << "Traversing std::list (bidirectional iterator): "; for (auto it = l.begin(); it != l.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; // Demonstrating random access (only valid for vector, not list) std::cout << "Accessing third element in vector using iterator arithmetic: "; auto v_it = v.begin(); v_it += 2; // advance by 2 positions std::cout << *v_it << std::endl; // Uncommenting the following lines would cause a compile error // because std::list iterators do not support random access // auto l_it = l.begin(); // l_it += 2; // std::cout << *l_it << std::endl; }

Iterator Operations and Supported Categories

Iterators provide several core operations that enable traversal and manipulation of container elements. The main operations are:

Understanding which operations are supported by each iterator category is essential for writing efficient and correct code. For example, you can use arithmetic operations with std::vector iterators, but not with std::list iterators. This distinction influences which algorithms and traversal patterns you can use with each container.

question mark

Which iterator supports arithmetic operations such as it + n to jump multiple positions?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 2

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Suggested prompts:

Can you explain which STL containers provide which iterator categories?

What are some practical examples of using different iterator operations?

How do I choose the right iterator for a specific STL container?

Awesome!

Completion rate improved to 6.67

bookIterator Categories and Traversal

Svep för att visa menyn

Iterators are a fundamental part of the C++ Standard Template Library (STL), providing a consistent way to access and traverse the elements of a container. The STL defines several iterator categories, each with different capabilities:

  • Input Iterators: allow reading elements in a single-pass, forward-only manner;
  • Output Iterators: allow writing elements in a single-pass, forward-only manner;
  • Forward Iterators: support both reading and writing, and can be used for multiple passes in the forward direction;
  • Bidirectional Iterators: extend forward iterators by also supporting backward traversal;
  • Random Access Iterators: provide all the capabilities of bidirectional iterators, plus direct access to any element in constant time using arithmetic operations.

Each STL container provides iterators of a specific category, depending on its internal structure. Understanding these categories helps you choose the right algorithms and traversal techniques for each container.

main.cpp

main.cpp

copy
123456789101112131415161718192021222324252627282930313233
#include <iostream> #include <vector> #include <list> int main() { std::vector<int> v = {1, 2, 3, 4, 5}; std::list<int> l = {10, 20, 30, 40, 50}; std::cout << "Traversing std::vector (random access iterator): "; for (auto it = v.begin(); it != v.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; std::cout << "Traversing std::list (bidirectional iterator): "; for (auto it = l.begin(); it != l.end(); ++it) { std::cout << *it << " "; } std::cout << std::endl; // Demonstrating random access (only valid for vector, not list) std::cout << "Accessing third element in vector using iterator arithmetic: "; auto v_it = v.begin(); v_it += 2; // advance by 2 positions std::cout << *v_it << std::endl; // Uncommenting the following lines would cause a compile error // because std::list iterators do not support random access // auto l_it = l.begin(); // l_it += 2; // std::cout << *l_it << std::endl; }

Iterator Operations and Supported Categories

Iterators provide several core operations that enable traversal and manipulation of container elements. The main operations are:

Understanding which operations are supported by each iterator category is essential for writing efficient and correct code. For example, you can use arithmetic operations with std::vector iterators, but not with std::list iterators. This distinction influences which algorithms and traversal patterns you can use with each container.

question mark

Which iterator supports arithmetic operations such as it + n to jump multiple positions?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 2
some-alt