C++中迭代器模式的实质是语言与标准库约定的接口协议:容器需提供begin()/end()函数,返回支持operator*、operator++、operator!=的迭代器类型,即可被范围for及STL算法消费。

什么是迭代器模式在 C++ 中的实质
迭代器模式在 C++ 里不是靠“设计模式类库”实现的,而是语言和标准库共同塑造的一套约定:只要你的容器类提供 begin() 和 end() 成员函数,返回满足特定接口要求的对象(比如支持 operator++、operator*、operator!=),它就能被 for (auto& x : container) 或 std::for_each 消费。
手写一个可遍历的聚合类需要哪几个关键组件
以自定义链表 MyList 为例,要让它支持范围 for 循环,必须提供:
-
begin()和end()成员函数,返回你自己的迭代器类型(如iterator) -
iterator类需重载:operator*(解引用)、operator++(前缀)、operator!=(用于循环终止判断) -
iterator内部通常持有一个指向节点的指针(如Node*),所有操作围绕它展开 - 注意 const 版本:
cbegin()/cend()和const_iterator要同步提供,否则const MyList l;无法用范围 for
常见编译错误及对应修复点
写完常遇到这些报错,基本都指向接口缺失或签名不对:
-
error: no match for 'operator!='→ 忘了给iterator实现operator!=,或者参数是const iterator&但你只写了iterator& -
error: use of deleted function 'MyList::iterator::iterator()'→ 在begin()里返回临时对象时,编译器尝试调用默认构造,但你没写或写了explicit构造且没传参 -
error: invalid initialization of reference of type 'int&' from expression of type 'const int'→iterator::operator*返回了const T&,但你在非 const 容器上调用了非常量版本的begin(),应区分operator*的 const/non-const 重载
std::vector 迭代器为什么不能直接拿来套用
别试图让自定义迭代器继承 std::iterator(C++17 已弃用)或硬塞进 std::vector<int>::iterator</int> 类型。原因很实在:
立即学习“C++免费学习笔记(深入)”;
- 标准容器迭代器是实现相关的,
std::vector用原生指针,std::list用封装节点指针的类,二者不可互换 - STL 算法只依赖概念(Concepts):只要你的类型支持
++it、*it、it != other,就能用std::sort、std::find—— 不关心你是不是 std::xxx_iterator - 强行模仿标准库内部命名(如
difference_type、value_type)反而容易因漏掉 typedef 导致std::distance编译失败
真正该花时间的地方,是把 operator++ 的行为写对:单向链表只能前向迭代,就别提供 --;树形结构若想支持中序遍历,得在迭代器内部维护栈或线索,而不是幻想靠一层 wrapper 解决。



















