迭代器的本质和使用
来源:互联网 发布:mysql and not exists 编辑:程序博客网 时间:2024/06/04 18:54
迭代器:把标志控制的循环和计数控制的循环统一为一种控制,即迭代器控制,每一次迭代操作中对迭代器的修改就等价于修改标志或计数器。
容器迭代器:类似于数据库中的游标(cursor),屏蔽了底层存储空间的不连续性,在上层使容器元素维持一种“逻辑连续”的假象。工作逻辑如下:
不可把迭代器与void*和“基类指针”混淆:指针代表真正的内存地址,即对象在内存中的存储位置;迭代器则代表元素在容器中的相对位置。
STL把迭代器分为5类,它们都是类模板,具有通用性。如下表:
迭代器能力大小:输入迭代器,输出迭代器 < 前进迭代器 < 双向迭代器 < 随机访问迭代器
常用迭代器所属迭代器类别:
& Vector的迭代器为随机访问迭代器,因为它就是原始指针;
& list的迭代器是双向迭代器,因为list是双向链表;
& slist的迭代器是前进迭代器;
& deque的迭代器是随机访问迭代器;
& set/map的迭代器是双向迭代器;
......
迭代器使用建议:
1)尽量使用迭代器类型,而不是显示地使用指针。例如使用vector<int>::iterator,而不是int *,虽然他们等价。
2)只使用迭代器提供的标准操作,不要使用任何非标准操作,以避免STL版本更新的时候出现不兼容问题。
3)当不会改动容器中元素值的时候,使用const迭代器(const_iterator)。
迭代器失效的危险性:迭代器失效是指其指向容器中的某个或某些元素的存储发生了变化,使之成为无效迭代器,使用无效迭代器同时用无效指针一样危险。
解决迭代器失效问题有两种方式:1)在代用迭代器时重新获取迭代器;2)在修改容器前为其预留足够的空闲空间以避免存储空间重分配。
提示:顺序容器vector和string都可用reserve()和resize()来预留空间或调整它们的大小:reserve()用来保留(扩充)容量,它并不改变容器的有效元素个数;resize()则调整容器大小(size,有效元素个数),而且有时候会大容器的容量。当把这两个函数与assign()、insert()、push_back()、replace()及泛型算法搭配起来使用的时候,需要小心。
解决无效迭代器示例如下:
//迭代器失效程序
#include<iostream>
#include<vector>
using namespace std;
void main(){
vector<int> ages; //未预留空间
ages.push_back(2); //引起内存重分配
vector<int>::const_iterator p = ages.begin();
for(int i = 0; i<10; i++){
ages.push_back(5); //引起若干次内存重分配
}
cout<<"The first age:"<<*p<<endl; //p已经失效,危险访问
}
//解决方案1,重新获取迭代器
void main(){
//...
vector<int>::const_iterator p = ages.begin();
for(int i = 0;i<10; i++){
ages.push_back(5); //引起若干次内存重分配
}
p = ages.begin(); //重新获取迭代器
cout<<"The first age:"<<*p<<endl; //OK
}
- 迭代器的本质和使用
- std::function的本质和使用特性
- std::function的本质和使用特性
- std::function的本质和使用特性
- UITableView reloadData的本质使用
- 引用的使用及其本质
- AOP的本质和意义
- 社会的本质和真相
- 编译程序和解释程序的本质
- 数字化的本质和基础
- 游戏和引擎的本质
- 矩阵和特征值的本质
- RPC的本质和问题
- 迭代器的本质
- [js点滴]使用var定义变量和不使用var的本质区别
- 进程和线程的本质和区别
- 人,与动物的本质区别,在哲学里说是制造和使用工具
- 利特尔法则的本质和使用——《可以量…
- linux下configure命令详细介绍
- ExtJS 4.*基础概念总结(基于Ext4.2.1)
- 工作那些事(二)应聘时填写个人信息ABCD
- 支付宝开发接口
- Eclipse开发环境配置
- 迭代器的本质和使用
- Cocos2d-x2.0 粒子系统深入分析三部曲(二)
- C Standard Library header files
- centos重启后应用文件夹属主改变的问题
- unity 字体添加边框颜色
- 直接选择排序——从键盘上接收一些随机整数,然后用选择排序后再输出
- Android 全局异常处理
- WIN32串口编程
- uva 11044 Searching for Nessy