读书笔记:C++ Primer系列(7)—— 标准库类型之iterator
2013-12-25 13:55
323 查看
题记:
继上篇所讲的vector,除了使用下标来访问vector对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器(iterator)。所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。迭代器是一种检查容器内元素并遍历元素的数据类型。
7.1 容器的iterator类型
每种容器类型都定义了自己的迭代器类型,如vector有:
vector<int>::iterator iter; //这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型
7.2 iterator的相关操作
begin和end操作
每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。
如果容器不为空,begin操作返回的迭代器指向容器的第一个元素;end操作返回的迭代器指向容器的“末端元素的下一个”,表明它指向了一个不存在的元素。
如果容器为空,则begin和end返回的迭代器相同。
自增和解引用操作
迭代器类型可使用解引用操作符(*)来访问迭代器所指向的元素。
解引用操作符返回迭代器当前所指向的元素。假设iter指向vector对象ivec的第一个元素,则*iter和ivec[0]就是指向同一个元素。
*iter = 0;//这条语句的作用就是将ivec[0]这个元素赋值为0
迭代器使用自增操作符(++)向前移动迭代器指向容器中下一个元素,即:如果iter指向容器的第一个元素,则++iter指向第二个元素
注意:由于end操作返回的迭代器不指向任何元素,因此不能对其进行解引用和自增操作。
迭代器比较操作——比较操作符(==或!=)
如果两个迭代器对象指向同一个元素,则它们相等,否则就不相等。
程序清单—01
附:每个容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器中的元素,而不能改变其值。
程序清单—02
上述程序第3行编译出错: error C3892: “iter”: 不能给常量赋值
上述程序正确,只是从容器中读取元素
继上篇所讲的vector,除了使用下标来访问vector对象的元素外,标准库还提供了另一种访问元素的方法:使用迭代器(iterator)。所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。迭代器是一种检查容器内元素并遍历元素的数据类型。
7.1 容器的iterator类型
每种容器类型都定义了自己的迭代器类型,如vector有:
vector<int>::iterator iter; //这条语句定义了一个名为iter的变量,它的数据类型是由vector<int>定义的iterator类型
7.2 iterator的相关操作
begin和end操作
每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。
如果容器不为空,begin操作返回的迭代器指向容器的第一个元素;end操作返回的迭代器指向容器的“末端元素的下一个”,表明它指向了一个不存在的元素。
如果容器为空,则begin和end返回的迭代器相同。
自增和解引用操作
迭代器类型可使用解引用操作符(*)来访问迭代器所指向的元素。
解引用操作符返回迭代器当前所指向的元素。假设iter指向vector对象ivec的第一个元素,则*iter和ivec[0]就是指向同一个元素。
*iter = 0;//这条语句的作用就是将ivec[0]这个元素赋值为0
迭代器使用自增操作符(++)向前移动迭代器指向容器中下一个元素,即:如果iter指向容器的第一个元素,则++iter指向第二个元素
注意:由于end操作返回的迭代器不指向任何元素,因此不能对其进行解引用和自增操作。
迭代器比较操作——比较操作符(==或!=)
如果两个迭代器对象指向同一个元素,则它们相等,否则就不相等。
程序清单—01
cout<<"方法1:使用下标将容器元素清0"<<endl; for(vector<int>::size_type ix=0;ix !=ivec.size();++ix) { ivec[ix]=0; } cout<<"方法2:使用迭代器将容器元素清0"<<endl; for(vector<int>::iterator iter = ivec.begin(); iter != ivec.end();++iter) { *iter=0; }
附:每个容器类型还定义了一种名为const_iterator的类型,该类型只能用于读取容器中的元素,而不能改变其值。
程序清单—02
for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end();++iter) { *iter=0; }
上述程序第3行编译出错: error C3892: “iter”: 不能给常量赋值
for(vector<int>::const_iterator iter = ivec.begin(); iter != ivec.end();++iter) { cout<<*iter<<endl; }
上述程序正确,只是从容器中读取元素
相关文章推荐
- [C++]关于i++和++i的学习
- C++新手出现的问题
- C++ primer 学习笔记 二
- C/C++复杂类型声明
- C++之单例模式 (Singleton)
- C++子类 父类的相互转换 和 虚函数
- c++中const关键字使用详解
- C/C++变量名命名规范
- Cracking the Coding Interview:: 寻找有环链表的环路起始节点
- C/C++获取文件大小(长度)的方法
- MFC - HOOK和数据库访问 ( 孙鑫C++第二十讲笔记整理 )
- C和C++中的结构体对比
- C++ namespace解析
- C语言铺地砖问题
- MFC- ActiveX编程(孙鑫C++第十八讲笔记整理 )
- C指针学习草稿1(读C语言的那些小秘密)
- Qt C++ GUI
- C++windows程序入门
- 【整理】C++获得系统时间,以及1970年1月1日到现在的秒数、毫秒数
- [零基础学软件开发8]选择结构if语句介绍之1