1. 迭代器的本質
迭代器是一種行為類似指針的對象,它可能是指針(如?std::vector
?的迭代器),也可能是封裝了指針的類(如?std::list
?的迭代器)。如果是指針那天然就可以用下面的運算,如果是類,就要重載下面的運算符:
-
*iter
:獲取元素的引用。? (解引用運算符) -
iter->member
:訪問元素的成員(若元素是對象)。? ? (成員訪問運算符) -
++iter
?/?--iter
:指針移動到下一個/上一個元素。
2.迭代器的?->
?行為
迭代器如果是類對象(非指針),需要重載?operator->()
。標準規定:
-
當寫?
it->member
?時,編譯器會編指令編成:-
調用?
it.operator->()
,獲取一個 元素的指針(比如?T*
)。 -
對元素的指針?自動再調用?
->
,最終訪問成員。
-
偽代碼演示
cpp
// 假設迭代器類內部: class ListIterator {Node* current; // 節點指針 public:// 重載 ->Person* operator->() { return &(current->data); // 返回對象指針} };// 使用時: it->name; // 實際展開: (it.operator->())->name; // 調用?it.operator->(),獲取一個 元素的指針(比如?T*)。元素指針?再調用?->,最終訪問成員。
?標準庫中的真實案例
(1)?std::list
?的迭代器實現(GCC)
cpp
// 簡化版的 list 迭代器 template<typename _Tp> struct _List_iterator {_List_node* _M_node; // 節點指針_Tp* operator->() const {return &(_M_node->_M_data); // 返回數據對象的指針} };// 使用時: std::list<Person>::iterator it = people.begin(); it->age; // 實際等價于:(it. operator->())->age