迭代器的思想和实现细节
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