C++迭代器基本内容讲述

开发 后端
在C++编程语言中,每种容器都会定义自己的C++迭代器的类型。我们将会在这里为大家详细介绍一下这方面的基本内容。

我们今天在这里为大家介绍的是C++迭代器的一些基本概念,希望大家可以从这篇文章中学到一些有用的内容,从而提高自己的编程效率。首先我们要清楚,C++迭代器是一种检查容器内元素并遍历元素的数据类型。#t#

 

标准库为每一种标准容器(包括 vector)定义了一种迭代器类型。迭代器类型提供了比下标操作更通用化的方法:所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。因为迭代器对所有的容器都适用,现代 C++ 程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的 vector 类型也是这样。

 

容器的 iterator 类型

每种容器类型都定义了自己的C++迭代器类型,如 vector:vector<int>::iterator iter;这符语句定义了一个名为 iter 的变量,它的数据类型是 vector<int> 定义的 iterator 类型。每个标准库容器类型都定义了一个名为 iterator 的成员,这里的 iterator 与迭代器实际类型的含义相同。

begin 和 end 操作每种容器都定义了一对命名为 begin 和 end 的函数,用于返回迭代器。如果容器中有元素的话,由 begin 返回的迭代器指向***个元素: vector<int>::iterator iter = ivec.begin();

上述语句把 iter 初始化为由名为 vector 操作返回的值。假设 vector 不空,初始化后,iter 即指该元素为ivec[0]。

由 end 操作返回的C++迭代器指向 vector 的“末端元素的下一个”。“超出末端迭代器”(off-the-end iterator)。表明它指向了一个不存在的元素。如果 vector 为空,begin 返回的迭代器与 end 返回的迭代器相同。

由 end 操作返回的迭代器并不指向 vector 中任何实际的元素,相反,它只是起一个哨兵(sentinel)的作用,表示我们已处理完 vector 中所有元素。

vector 迭代器的自增和解引用运算

C++迭代器类型定义了一些操作来获取迭代器所指向的元素,并允许程序员将迭代器从一个元素移动到另一个元素。迭代器类型可使用解引用操作符(dereference operator)(*)来访问迭代器所指向的元素:

*iter = 0;

解引用操作符返回迭代器当前所指向的元素。假设 iter 指向 vector 对象 ivec 的***元素,那么 *iter 和ivec[0] 就是指向同一个元素。上面这个语句的效果就是把这个元素的值赋为 0。迭代器使用自增操作符(1.4.1 节)向前移动迭代器指向容器中下一个元素。从逻辑上说,C++迭代器的自增操作和int 型对象的自增操作类似。对 int 对象来说,操作结果就是把 int 型值“加 1”,而对迭代器对象则是把容器中的迭代器“向前移动一个位置”。因此,如果 iter 指向***个元素,则 ++iter 指向第二个元素。

由于 end 操作返回的迭代器不指向任何元素,因此不能对它进行解引用或自增操作。

示例程序:编写程序来创建有10个元素的vector对象

  1. #include <iostream> 
  2. #include <vector> 
  3. using namespace std;int main()  
  4. {   
  5. //定义并赋值输出   
  6. vector<int> ivec;   
  7. cout<<"Befort *2 the elements are:"<<endl;   
  8. for(vector<int>::size_type ix=0;  
  9. ix!=10;++ix){ ivec.push_back(ix);   
  10. cout<<ivec[ix]<<'\t';   
  11. }   
  12. //把每个值乘以2并输出   
  13. cout<<endl<<"After *2 the elements are:"<<endl;   
  14. for(vector<int>::iterator iter=ivec.begin();  
  15. iter!=ivec.end();++iter)  
  16. {   
  17. *iter*=2; cout<<*iter<<'\t';   
  18. }   
  19. return 0;  

以上就是C++迭代器相关内容的介绍。

责任编辑:曹凯 来源: 博客园
相关推荐

2010-02-05 10:08:55

C++名字空间

2010-02-06 13:58:13

C++ Bost库

2010-02-05 13:35:19

C++虚析构函数

2010-02-03 15:06:02

C++可变参数表

2010-02-02 15:12:09

C++ explici

2010-01-04 15:21:37

Silverlight

2009-09-10 10:47:05

C# form

2010-04-22 09:36:56

Oracle数据字典

2010-01-28 15:33:37

Android程序架构

2010-02-25 15:49:05

WCF消息模式

2010-03-02 15:53:02

WCF服务合同

2010-02-25 17:51:04

WCF服务地址

2017-10-25 06:50:27

数据科学数据数据分析

2010-03-05 11:53:20

Python命名约定

2010-02-01 14:07:12

C++多态性

2010-02-05 17:34:37

C++函数模板

2010-02-04 15:58:39

C++浅拷贝

2010-03-02 17:55:37

WCF终结点地址

2010-03-03 15:26:54

Python编码规范

2010-02-25 17:04:54

WCF实例上下文
点赞
收藏

51CTO技术栈公众号