首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

C++ Primer 學習筆記 42:STL 實踐與分析(16)——迭代器基礎(上)

     編輯:C++ 入門

系列引言

本文為《C++ Primer》學習筆記系列第 42 篇,開啟「STL 實踐與分析」專題的「再談迭代器」三部曲之首篇(上)。旨在系統梳理 STL 迭代器的核心概念、分類體系、基本操作及其與容器、算法的協作機制,為後續進階主題(iostream 迭代器、反向迭代器、const 迭代器)奠定基礎。

迭代器核心概念

  • 定義:迭代器是一種泛化指針的對象,提供對容器元素的統一訪問接口,屏蔽底層數據結構差異。
  • 五大類別(功能由弱到強):
    1. 輸入迭代器:單遍歷、只讀(如 istream_iterator)
    2. 輸出迭代器:單遍歷、只寫(如 ostream_iterator)
    3. 前向迭代器:多遍歷、可讀寫、單向移動(如 forward_list)
    4. 雙向迭代器:雙向移動(如 list, set, map)
    5. 隨機訪問迭代器:支持算術運算、關係運算、O(1) 跳轉(如 vector, deque, array)
  • 迭代器特性萃取:iterator_traits 統一獲取迭代器的 value_type, difference_type, pointer, reference, iterator_category,支撐泛型算法根據迭代器類別優化實現(如 advance, distance)。

基本操作與慣用語

// 容器定義迭代器類型
vector<int>::iterator it;
vector<int>::const_iterator cit;
vector<int>::reverse_iterator rit;

// 獲取始末迭代器
auto begin = vec.begin();  // 指向首元素
auto end   = vec.end();    // 指向尾後位置(左閉右開區間 [begin, end))

// 遍歷模式
for (auto it = vec.begin(); it != vec.end(); ++it) { /* ... */ }
// C++11 範圍 for
for (auto &elem : vec) { /* ... */ }

迭代器失效規則(重點)

修改容器結構(插入/刪除/擴容)可能導致迭代器失效:

  • vector:插入/刪除/擴容導致所有迭代器失效;reserve 可避免擴容失效。
  • deque:首尾插入不失效,中間插入/刪除導致所有失效。
  • list/forward_list:插入不失效,刪除僅失效被刪除元素的迭代器。
  • 關聯容器:插入/刪除不失效其他迭代器,僅失效被刪除元素的迭代器。

學習路徑建議

掌握本篇基礎後,建議依次閱讀第 43 篇(iostream 迭代器進階)、第 44 篇(反向迭代器習題實戰)、第 45 篇(const 迭代器與容器操作),並結合《Effective STL》條款 26~29 深化理解。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved