迭代器是一种检查容器内元素并便利元素的数据类型,迭代器可以很大程度上隔离容器底层实现,使用时只需依赖迭代器相对统一的方法/接口。Iterator类的访问方式就是把不同集合类的访问逻辑抽象出来,使得不用暴露集合内部的结构而达到循环遍历集合的效果。
1 容器的Iterator类型
vector<int>::iterator iter; 定义一个名为iter的变量,数据类型是vector<int>定义的iterator类型。
迭代器和迭代器类型的区别?
iterator表述两种事物,一般指的是迭代器的概念;而具体指的是vector定义的具体iterator类型,如vector<int>
若一种类型支持一组确定的操作,则称这种类型为迭代器。
每个容器都定义了iterator类型,而这种类型支持迭代器的各种操作。
2 begin和end操作(返回的是迭代器类型)
vector<int> ivec;
vector<int>::iterator iter = ivec.begin();
vector<int>::iterator iter1 = ivec.end();
begin指向第一个元素,即ivec[0]
end指向末端元素的下一个,指向一个不存在的元素。(启动一个哨兵的作用)
若vector为空,begin和end返回的迭代器相同。
3 基本操作
*iter = 0; 等价于 ivec[0] = 0
++iter 指向iter的下一个元素
可以使用== 或 != 比较两个迭代器是否相同
for (vector<int>::iterator iter = ivec.begin(); iter != ivec.end(); iter++) *iter = 0; 等价于
for (vector<int>::size_type ix= 0; ix != ivec.size(); ix++) ivec[ix]= 0;
3 const_iterator
(1) vector<int>::const_iterator iter 表示指向的值为常量,iter可移动指针
const vector<int>::iterator iter 表示指针为常量,不可移动指针,可修改其值
(2)算术操作
iter+n iter-n 表示迭代器向前或向后移动迭代器
iter1-iter2 计算两个迭代器的距离
vector<int>::iterator mid = vi.begin() + vi.size()/2 计算中间元素
可通过end和begin函数计算容器的大小,如下
vector<int>::size_type size = str.end() - str.begin();
cout << size << endl;
vector<int>::iterator mid = (vi.begin() + vi.end())/2 编译报错,两个地址不允许做加法和除法
example:
#include <vector>
#include <iostream>
using namespace std;
using std::vector;
int main()
{
string word;
vector <string> str(3);
str[0] = "aaa";
str[1] = "bbb";
str[2] = "ccc";
vector<string>::iterator mid = str.begin() + str.size()/2;
cout << *mid << endl;
str.push_back("ddd");
str.push_back("eee");
str.push_back("fff");
vector<string>::iterator mid2 = str.begin() + str.size()/2;
cout << *mid2 << endl;
return 0;
}
[root@iZwz9a9kyixoqvys89ewj4Z vector]# ./a.out
bbb
ddd