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