目录
什么是迭代器
迭代器的类型
迭代器的用法
三种迭代器
范围for
什么是迭代器
它提供了一种访问容器(如列表、集合等)中元素的方法,而无需暴露容器的内部表示。迭代器使得程序员能够以统一的方式遍历不同的数据结构,而无需关心这些数据结构的具体实现细节。类似于指针指向对应的元素并且能对这个元素进行修改和使用。
迭代器的类型
有4种迭代器形式:
正向迭代器:
语法:容器名::iterator 迭代器名字;
正向常量迭代器:
语法:容器名::const_iterator 迭代器名字;
反向迭代器:
语法:容器名::reverse_iterator 迭代器名字;
反向常量迭代器:
语法:容器名::const_reverse_iterator 迭代器名字;
迭代器的用法
前面说迭代器类似于一个指针,所以用法和指针也是类似的
vector<int> v = {1,2,3,4};
vector<int>::iterator i;//定义一个vector的迭代器
i = v.begin();//让i 等于 v 的第一个元素
int *p = &v[i];//定义一个指针
int j = *i;
int k = *p;
此时 j == k 。说明了迭代器和指针是类似的,因为迭代器就是封装了对应类型的指针。
迭代器都可以进行++:
正向迭代器的++ 是向后移动。
反向迭代器的++ 是向前移动。
下面我们使用vector进行遍历和修改:
//vector是c++的容器,类似于一个数组,但是支持变长
vector<int> v;
vector<int>::iterator it;
//这里给v 中插入了5个数字 0 1 2 3 4 5
for (int i = 0; i < 5; i++)
{
v.push_back(i);
}
//打印v的内容
for (it = v.begin(); it != v.end(); ++it)
{
cout << *it << ' ';
}
cout << endl;
//改变v的内容
for (it = v.begin(); it != v.end(); ++it)
{
*it *= 2;
}
cout << endl;
//打印改变后的内容
for (it = v.begin(); it != v.end(); ++it)
{
cout << *it << ' ';
}
cout << endl;
//用反向迭代器遍历v
for (vector<int>::reverse_iterator j = v.rbegin(); j != v.rend(); ++j)
cout << *j << " ";
结果如下:
注意:
1.it 用的是 != v.end(),这是为什么?而不是 < end() 在部分容器里用 < end(),是可以的,比如现在使用的vector,但是对于部分不是连续空间的容器类似 list 等等无法通过 < end()比较当前位置。
2.可以看出反向迭代器的++是逆向的。
3.为什么用的是前置++而不是后置++?
因为前置++的效率更高
// 前置++ Date& Date::operator++() { // 复用operator+= *this += 1; return *this; } // 后置++ Date Date::operator++(int) { Date tmp(*this);// 拷贝构造tmp,用于返回 // 复用operator+= *this += 1; return tmp; }
如上代码:
1.operator区分前置++和后置++是看有没有参数(语法规定)
2.为什么前置++效率高,因为前置++直接对 *this操作然后返回,后置++则是先拷贝构造了一份tmp。
三种迭代器
第一只:正向迭代器
只可以进行++ ,和*i,还支持== != 等操作。
第二只:双向迭代器
可以进行++ 或者 -- 。比正向迭代器多一种--手段。
第三只:随机迭代器
拥有上面两种迭代器的全部功能。并且支持随机访问,i + 10,代表了往后10个元素。同时支持下标访问数组
vector<int>::iterator i;
i += 10;//向后移动10个元素
i[10];//第10个元素的位置
对于随机迭代器通常只出现在物理空间连续的容器上,例如vector。
而物理空间不连续的例如list,上是没有随机访问这种功能的。
和 数组 和 链表的定义是类似的。
所以不同容器的迭代器不同,有些容器没有迭代器。
范围for
范围for就是利用迭代器实现的遍历容器的方法
具体使用如下:
vector<int> v;
//这里给v 中插入了5个数字 0 1 2 3 4 5
for (int i = 0; i < 5; i++)
{
v.push_back(i);
}
//范围for
for (int num : v)
{
cout << num<<' ';
}
范围for其实就是迭代器遍历,其中 int num 就是 *it .
结果如下: