C++中的迭代器(iterator)

迭代器(Iterator)的介绍
背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间费连续的,就似指针的类,来对非数组的数据结构进行遍历。

定义:迭代器是一种检查容器内元素并遍历元素的数据类型。
迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围。

迭代器(Iterator)是指针(pointer)的泛化,它允许程序员用相同的方式处理不同的数据结构(容器)。特点:
(1)迭代器类似于C语言里面的指针类型,它提供了对对象的间接访问。
(2)指针是C语言中的知识点,迭代器是C++中的知识点。指针较灵活,迭代器功能较丰富。
(3)迭代器提供一个对容器对象或者string对象的访问方法,并定义了容器范围。

迭代器和指针的区别:
容器和string有迭代器类型同时拥有返回迭代器的成员。如:容器有成员begin和end,其中begin成员复制返回指向第一个元素的迭代器,而end成员返回指向容器尾元素的下一个位置的迭代器,也就是说end指示的是一个不存在的元素,所以end返回的是尾后迭代器。

容器迭代器的使用:
每种容器类型都定义了自己的迭代器类型,如vector:vector< int>:: iterator iter;//定义一个名为iter的变量,数据类型是由vector< int>定义的iterator 类型。简单说就是容器类定义了自己的iterator类型,用于访问容器内的元素。每个容器定义了一种名为iterator的类型,这种类型支持迭代器的各种行为。
迭代器类型主要支持两类,随机访问和双向访问。其中vector和deque支持随机访问,list,set,map等支持双向访问。
1)随机访问:提供了对数组元素进行快速随机访问以及在序列尾部进行快速插入和删除操作。
2)双向访问:插入和删除所花费的时间是固定的,与位置无关。

### C++ 迭代器简介 迭代器C++标准模板库(STL)中的一个重要概念,用于提供一种统一的方式来访问容器中的元素。通过迭代器可以像指针一样操作序列容器(如`vector`, `list`)以及关联容器(如`map`, `set`),而无需关心底层的数据结构细节。 #### 基本语法与定义 对于向量(vector),可以通过如下方式声明并初始化一个迭代器: ```cpp std::vector<int>::iterator iter = vt.begin(); // 起始位置的迭代器[^1] std::vector<int>::iterator iter_end = vt.end(); // 结束位置的迭代器 ``` 这里创建了两个迭代器对象`iter`和`iter_end`分别指向向量的第一个元素和最后一个元素之后的位置。注意,`end()`返回的是超出范围的一个位置,并不对应任何实际存在的元素。 #### 遍历容器 利用上述定义好的迭代器,能够轻松地遍历整个容器内的所有项: ```cpp for (std::vector<int>::iterator it = vt.begin(); it != vt.end(); ++it){ std::cout << *it << " "; } ``` 这段代码会依次输出向量内每一个整数值。其中`*it`表示解引用当前迭代器所指向的内容;`++it`则是使迭代器前进到下一个位置的操作符重载形式。 #### 自定义迭代器 除了内置支持的标准迭代器外,在某些情况下可能还需要构建特定用途的自定义迭代器。借助于Boost库提供的工具类`boost::iterator_adaptor`可以帮助简化这一过程。下面给出了一段展示如何基于此机制设计简单迭代器的例子[^2]: ```cpp #include <boost/iterator/iterator_adaptor.hpp> // ...其他必要的头文件... class MyIterator : public boost::iterator_adaptor< MyIterator, // Derived int*, // Base boost::use_default // Value type > { private: friend class boost::iterator_core_access; protected: explicit MyIterator(int* p): iterator_adaptor_(p){} public: MyIterator() {} }; void example_usage(){ int arr[] = {0, 1, 2}; MyIterator first(arr), last(arr + sizeof(arr)/sizeof(*arr)); while(first!=last){ std::cout<<*first<<" "; ++first; } } ``` 在这个例子中,实现了自己的迭代器类型`MyIterator`,它可以用来遍历普通的C风格数组。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值