[C++]iterator

本文深入探讨了C++中的迭代器,包括其基本形式、与容器的关系、五种迭代器类型及其特性。通过分析自定义容器所需迭代器的操作和类型,揭示了设计迭代器的重要性。同时,讨论了迭代器的相应类型、继承STL Iterator模板以及关键操作如不相等比较、解引用、递增和复制行为。此外,还提到了begin()和end()函数,以及迭代器的value type、difference type和reference type等概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文,仅对C++ iterator的知识点进行归纳整理,给出设计的关键步骤。

参考:
  1. 资料一:http://www.cplusplus.com/reference/iterator/(第一参考,简单精要)
  2. 资料二:http://jjhou.boolan.com/programmer-3-traits.pdf(侯捷随笔,非常全面,有时间深刻可看)
  3. 资料三:http://en.cppreference.com/w/cpp/iterator(纯资料)

资料精解:
  1. 资料二
    1. 推演思路:算法的泛化、迭代器的基本形式及其操作、迭代器与容器的关系、迭代器的五种相应类型。
    2. 结论:设计适当的相应类型,是迭代器的责任;设计适当的迭代器,则是容器的责任。唯有容器本身,才知道该设计怎样的迭代器来遍历自己
### C++ 迭代器的基础概念 迭代器(Iterator)在 C++ 中是一种用于访问容器中元素的对象。它们类似于指针,可以用来遍历容器中的数据结构。STL 容器类提供了多种类型的迭代器以支持不同的操作模式。 #### 基本定义 迭代器是一个通用的概念,在 STL 中被广泛使用。通过迭代器,程序能够像处理数组一样处理各种容器的数据项。C++ 提供了几种不同种类的迭代器,每一种都对应特定的操作需求[^1]。 --- ### 类型分类 以下是常见的几种迭代器类型及其特点: #### 输入迭代器(Input Iterator) 输入迭代器允许读取单向序列中的值一次。通常只提供前移功能,无法回退。 - 支持解引用 `*` 和箭头运算符 `->` 来获取当前指向的值或成员变量。 - 只能向前移动,不允许多次读取同一位置上的值。 #### 输出迭代器(Output Iterator) 输出迭代器与输入迭代器相反,主要用于写入数据到目标位置。同样也仅限于一次性赋值并不可重复修改已写过的位置。 #### 前向迭代器(Forward Iterator) 相比简单的输入/输出迭代器,前向迭代器增加了多次访问同一个地址的能力。这意味着它可以保存状态以便稍后再返回查看之前已经见过的内容。 #### 双向迭代器(Bidirectional Iterator) 双向迭代器除了具备前向迭代器的功能外还扩展了反方向导航的支持——即可以通过调用 `.prev()` 或者减号 `-=` 实现倒序遍历列表等功能。 #### 随机存取迭代器(Random Access Iterator) 这种最高级别的迭代器几乎涵盖了所有其他形式的优点:不仅拥有上述提到的所有特性还包括索引定位(`[]`)以及算术表达式的加减计算(+,-),从而使得随机跳转变得非常容易实现。 --- ### 使用实例 下面展示如何利用这些不同类型创建实际应用案例: ```cpp #include <iostream> #include <vector> int main(){ std::vector<int> vec = {10, 20, 30}; // Random access iterator example auto rand_it = vec.begin(); *(rand_it + 1) += 5; std::cout << "Modified element at index 1: "<<*(vec.begin()+1)<< "\n"; // Forward iterator example with find algorithm const int targetValue=20; auto fwd_it = std::find(vec.begin(), vec.end(),targetValue); if(fwd_it!=vec.end()){ std::cout<< "Found value:"<< *fwd_it<<"\n"; } return 0; } ``` 此代码片段展示了两个主要场景下的迭代器运用方式: 1. 对 vector 元素执行基于偏移量的变化; 2. 利用标准库函数寻找指定数值所在之处。 --- ### 关联模板元编程工具 - `std::enable_if` 当讨论高级主题如 SFINAE 技巧时会涉及到另一个重要组件叫做 `std::enable_if`. 此机制可以帮助开发者有条件地启用某些方法签名或者重载版本取决于编译期条件判断的结果。简化版语法如下所示: ```cpp template<bool B, class T = void> using enable_if_t = typename std::enable_if<B,T>::type ; ``` 例如我们可以设计一个接受整数参数但拒绝浮点数传参的简单函数原型: ```cpp template<typename NumType, typename std::enable_if<std::is_integral<NumType>::value,int>::type =0 > void onlyForIntegers(NumType n){ std::cout<<"Integer received:"<<n<<"\n"; } // Usage Example: onlyForIntegers(7); // Valid call. // onlyForIntegers(7.89); // Compilation error due to disabled overload. ``` 这里借助了 traits 类族检测类型属性再配合上 `std::enable_if`, 达到了灵活控制接口行为的目的[^2]. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值