自定义容器实现支持STL的迭代器与反向迭代器的API要求是什么
一、正向迭代器要求确认
你列出的现有要求是准确的,仅需补充一点:自定义迭代器类需要实现和你声明的iterator_category匹配的运算符操作,否则无法兼容STL算法:
- 前向迭代器至少要实现
operator++(前置+后置)、operator*、operator->、operator==、operator!= - 双向迭代器额外实现
operator--(前置+后置) - 随机访问迭代器额外实现偏移加减、下标访问、大小比较等运算符
二、反向迭代器的API要求
反向迭代器分两种实现场景,要求不同:
场景1:使用标准库std::reverse_iterator包装(99%场景推荐)
不需要单独编写反向迭代器类,直接复用已实现的正向迭代器即可,仅需在容器内部补充以下内容:
- 类型定义
typedef std::reverse_iterator<iterator> reverse_iterator; typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
- 成员方法
// 非const版本 reverse_iterator rbegin(); reverse_iterator rend(); // const版本 const_reverse_iterator rbegin() const; const_reverse_iterator rend() const; // 常量专用版本 const_reverse_iterator crbegin() const; const_reverse_iterator crend() const;
实现逻辑非常简单:rbegin()对应正向迭代器的end(),rend()对应正向迭代器的begin()即可,示例如下:
reverse_iterator rbegin() { return reverse_iterator(end()); } reverse_iterator rend() { return reverse_iterator(begin()); }
标准库的std::reverse_iterator已经内置了所有符合STL要求的类型定义和运算符重载,无需额外开发。
场景2:自定义反向迭代器类(仅特殊场景需要)
如果因业务逻辑无法使用标准库包装,需要自研反向迭代器类,那么要求和正向迭代器完全一致:
- 迭代器类内部必须定义5个必需类型:
value_type、reference、pointer、difference_type、iterator_category - 实现对应迭代器类别的所有运算符,注意反向迭代器的
operator++对应正向迭代器的--,operator--对应正向迭代器的++,解引用取当前位置的前一个元素即可 - 容器内部同样要补充场景1中列出的反向迭代器类型定义,以及
rbegin/rend系列成员方法
内容的提问来源于stack exchange,提问作者Ariel Yael
相关产品推荐
相关产品推荐

