不能直接用 raw pointer 当迭代器,因为需满足 std::iterator_traits 要求、区分 const_iterator/iterator、控制访问权限及便于扩展;必须自定义类并显式声明 value_type 等类型别名。

为什么不能直接用 raw pointer 当迭代器
因为标准容器的迭代器要满足 std::iterator_traits 的要求,比如支持 ++、*it、it != end(),还要区分 const_iterator 和 iterator。裸指针虽然能用,但无法控制访问权限(比如 begin() 返回 const T* 时,用户仍可能强制转成非 const),也不便于后期扩展(比如加边界检查、引用计数等)。
所以得自己写类,而不是 typedef。
iterator 和 const_iterator 的实现差异
核心区别在解引用返回类型和构造来源:
-
iterator解引用返回T&,只能由非 const 对象的begin()/end()构造 -
const_iterator解引用返回const T&,可由 const 或非 const 对象构造;通常让iterator隐式转为const_iterator(加一个operator const_iterator() const) - 两者底层都可复用同一套指针逻辑,只是接口语义不同
示例骨架:
template<typename t>
class array {
T* data_;
size_t size_;
<p>public:
class iterator {
T<em> ptr_;
public:
iterator(T</em> p) : ptr<em>(p) {}
T& operator<em>() { return </em>ptr</em>; }
iterator& operator++() { ++ptr<em>; return *this; }
bool operator!=(const iterator& other) const { return ptr</em> != other.ptr_; }
// ... 其他必需操作符
};</p>
<pre class="brush:php;toolbar:false;">class const_iterator {
const T* ptr_;
public:
const_iterator(const T* p) : ptr_(p) {}
const_iterator(const iterator& it) : ptr_(it.ptr_) {} // 允许隐式转换
const T& operator*() const { return *ptr_; }
const_iterator& operator++() { ++ptr_; return *this; }
bool operator!=(const const_iterator& other) const { return ptr_ != other.ptr_; }
// ...
};
iterator begin() { return iterator(data_); }
const_iterator begin() const { return const_iterator(data_); }
const_iterator cbegin() const { return const_iterator(data_); }
iterator end() { return iterator(data_ + size_); }
const_iterator end() const { return const_iterator(data_ + size_); }
};
必须重载哪些操作符才算“可用”
最低限度(满足范围 for 和常见算法如 std::find):
-
operator*和operator->(后者可委托给前者) -
operator++(int)和operator++()(前/后置递增) -
operator==和operator!= - 如果想支持
it + n或it[n],还得加operator+、operator+=、operator[]、operator-等 —— 这时建议继承std::iterator<:random_access_iterator_tag t></:random_access_iterator_tag>(C++17 起已弃用,但语义仍需手动提供)
注意:不实现 operator-- 就不能用于 std::reverse_iterator,但 forward-only 场景下可省略。
容易被忽略的细节:value_type 和 traits 声明
很多自定义迭代器跑不起来 std::sort 或 std::distance,是因为没显式声明关键类型别名。必须在 iterator 类内部加:
using value_type = T; using difference_type = std::ptrdiff_t; using pointer = T*; using reference = T&; using iterator_category = std::random_access_iterator_tag;
否则 std::iterator_traits<myiter>::value_type</myiter> 会推导失败,模板实例化直接报错,错误信息里常带 __type_pack_element 或 “no member named 'value_type'” 这类提示。
另外,const_iterator 的 value_type 仍是 T(不是 const T),这是标准要求 —— value_type 描述元素“本来是什么类型”,而非“当前怎么访问它”。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











