您的位置:首页 > 编程语言 > C语言/C++

读书笔记: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

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;
}


上述程序正确,只是从容器中读取元素
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: