热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

STL迭代器的种类及其功能介绍

本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。

标准模板库(The Standard Template Library, STL)定义了五种迭代器。下面的图表画出了这几种:

            input         output
              /            /
                 forward
                     |
                bidirectional
                     |
               random access

 

 

要注意,上面这图表并不是表明它们之间的继承关系:而只是描述了迭代器的种类和接口。处于图表下层的迭代器都是相对于处于图表上层迭代器的扩张集。例如:forward迭代器不但拥有input和output迭代器的所有功能,还拥有更多的功能。

各个迭代器的功能如下:

迭代器类别

说明

输入

从容器中读取元素。输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍算法,同一个输入迭代器不能两遍遍历一个序列

输出

向容器中写入元素。输出迭代器只能一次一个元素向前移动。输出迭代器只支持一遍算法,统一输出迭代器不能两次遍历一个序列

正向

组合输入迭代器和输出迭代器的功能,并保留在容器中的位置

双向

组合正向迭代器和逆向迭代器的功能,支持多遍算法

随机访问

组合双向迭代器的功能与直接访问容器中任何元素的功能,即可向前向后跳过任意个元素

迭代器的操作:

每种迭代器均可进行包括表中前一种迭代器可进行的操作。

迭代器操作

说明

所有迭代器

p++

后置自增迭代器

++p

前置自增迭代器

输入迭代器

*p

复引用迭代器,作为右值

p=p1

将一个迭代器赋给另一个迭代器

p==p1

比较迭代器的相等性

p!=p1

比较迭代器的不等性

输出迭代器

*p

复引用迭代器,作为左值

p=p1

将一个迭代器赋给另一个迭代器

正向迭代器

提供输入输出迭代器的所有功能

双向迭代器

--p

前置自减迭代器

p--

后置自减迭代器

随机迭代器

p+=i

将迭代器递增i位

p-=i

将迭代器递减i位

p+i

在p位加i位后的迭代器

p-i

在p位减i位后的迭代器

p[i]

返回p位元素偏离i位的元素引用

p

如果迭代器p的位置在p1前,返回true,否则返回false

p<&#61;p1

p的位置在p1的前面或同一位置时返回true&#xff0c;否则返回false

p>p1

如果迭代器p的位置在p1后&#xff0c;返回true&#xff0c;否则返回false

p>&#61;p1

p的位置在p1的后面或同一位置时返回true&#xff0c;否则返回false

只有顺序容器和关联容器支持迭代器遍历&#xff0c;各容器支持的迭代器的类别如下&#xff1a;

容器

支持的迭代器类别

说明

vector

随机访问

一种随机访问的数组类型&#xff0c;提供了对数组元素进行快速随机访问以及在序列尾部进行快速的插入和删除操作的功能。可以再需要的时候修改其自身的大小

deque

随机访问

一种随机访问的数组类型&#xff0c;提供了序列两端快速进行插入和删除操作的功能。可以再需要的时候修改其自身的大小

list

双向

一种不支持随机访问的数组类型&#xff0c;插入和删除所花费的时间是固定的&#xff0c;与位置无关。

set

双向

一种随机存取的容器&#xff0c;其关键字和数据元素是同一个值。所有元素都必须具有惟一值。

multiset

双向

一种随机存取的容器&#xff0c;其关键字和数据元素是同一个值。可以包含重复的元素。

map

双向

一种包含成对数值的容器&#xff0c;一个值是实际数据值&#xff0c;另一个是用来寻找数据的关键字。一个特定的关键字只能与一个元素关联。

multimap

双向

一种包含成对数值的容器&#xff0c;一个值是实际数据值&#xff0c;另一个是用来寻找数据的关键字。一个关键字可以与多个数据元素关联。

stack

不支持

适配器容器类型&#xff0c;用vector&#xff0c;deque或list对象创建了一个先进后出容器

queue

不支持

适配器容器类型&#xff0c;用deque或list对象创建了一个先进先出容器

priority_queue

不支持

适配器容器类型&#xff0c;用vector或deque对象创建了一个排序队列

下面列举了些例子说明各个容器的用法&#xff1a;
1、vector

View Code

#include
#include
int main()
{std::vector
<char> charVector;int x;for (x&#61;0; x<10; &#43;&#43;x)charVector.push_back(65 &#43; x);int size &#61; charVector.size();for (x&#61;0; xx){std::vector<char>::iterator start &#61;charVector.begin();charVector.erase(start);std::vector<char>::iterator iter;for (iter &#61; charVector.begin(); iter !&#61; charVector.end(); iter&#43;&#43;){std::cout <<*iter;}std::cout << std::endl;}return 0;
}

 

2、deque

View Code

#include
#include
int main()
{std::deque
<char> charDeque;int x;for (x&#61;0; x<10; &#43;&#43;x)charDeque.push_front(65 &#43; x);int size &#61; charDeque.size();for (x&#61;0; xx){std::deque<char>::iterator start &#61;charDeque.begin();charDeque.erase(start);std::deque<char>::iterator iter;for (iter &#61; charDeque.begin(); iter !&#61; charDeque.end(); iter&#43;&#43;){std::cout <<*iter;}std::cout << std::endl;}return 0;
}

 

3、list

View Code

#include
#include
int main()
{
// Create and populate the list.int x;std::list<char> charList;for (x&#61;0; x<10; &#43;&#43;x)charList.push_front(65 &#43; x);// Display contents of list.std::cout <<"Original list: ";std::list<char>::iterator iter;for (iter &#61; charList.begin(); iter !&#61; charList.end(); iter&#43;&#43;){std::cout <<*iter;//char ch &#61; *iter;//std::cout <
}std::cout << std::endl;// Insert five Xs into the list.std::list<char>::iterator start &#61; charList.begin();charList.insert(&#43;&#43;start, 5, &#39;X&#39;);// Display the result.std::cout <<"Resultant list: ";for (iter &#61; charList.begin(); iter !&#61; charList.end(); iter&#43;&#43;){std::cout <<*iter;//char ch &#61; *iter;//std::cout <
}return 0;
}

 

4、set

View Code

#include
#include
<set>int main()
{
// Create the set object.std::set<char> charSet;// Populate the set with values.charSet.insert(&#39;E&#39;);charSet.insert(&#39;D&#39;);charSet.insert(&#39;C&#39;);charSet.insert(&#39;B&#39;);charSet.insert(&#39;A&#39;);// Display the contents of the set.std::cout <<"Contents of set: " << std::endl;std::set<char>::iterator iter;for (iter &#61; charSet.begin(); iter !&#61; charSet.end(); iter&#43;&#43;)std::cout <<*iter << std::endl;std::cout << std::endl;// Find the D.iter &#61; charSet.find(&#39;D&#39;);if (iter &#61;&#61; charSet.end())std::cout <<"Element not found.";elsestd::cout <<"Element found: " <<*iter;return 0;
}

 

5、multiset

View Code

#include
#include
<set>int main()
{
// Create the first set object.std::multiset<char> charMultiset1;// Populate the multiset with values.charMultiset1.insert(&#39;E&#39;);charMultiset1.insert(&#39;D&#39;);charMultiset1.insert(&#39;C&#39;);charMultiset1.insert(&#39;B&#39;);charMultiset1.insert(&#39;A&#39;);charMultiset1.insert(&#39;B&#39;);charMultiset1.insert(&#39;D&#39;);// Display the contents of the first multiset.std::cout <<"Contents of first multiset: " << std::endl;std::multiset<char>::iterator iter;for (iter &#61; charMultiset1.begin();iter !&#61; charMultiset1.end(); iter&#43;&#43;)std::cout <<*iter << std::endl;std::cout << std::endl;// Create the second multiset object.std::multiset<char> charMultiset2;// Populate the multiset with values.charMultiset2.insert(&#39;J&#39;);charMultiset2.insert(&#39;I&#39;);charMultiset2.insert(&#39;H&#39;);charMultiset2.insert(&#39;G&#39;);charMultiset2.insert(&#39;F&#39;);charMultiset2.insert(&#39;G&#39;);charMultiset2.insert(&#39;I&#39;);// Display the contents of the second multiset.std::cout <<"Contents of second multiset: "<< std::endl;for (iter &#61; charMultiset2.begin();iter !&#61; charMultiset2.end(); iter&#43;&#43;)std::cout <<*iter << std::endl;std::cout << std::endl;// Compare the sets.if (charMultiset1 &#61;&#61; charMultiset2)std::cout <<"set1 &#61;&#61; set2";else if (charMultiset1 < charMultiset2)std::cout <<"set1 ";else if (charMultiset1 > charMultiset2)std::cout <<"set1 > set2";return 0;
}

 

6、map

View Code

#include
#include
typedef std::map<int, char> MYMAP;int main()
{
// Create the first map object.
MYMAP charMap1;// Populate the first map with values.charMap1[1] &#61; &#39;A&#39;;charMap1[4] &#61; &#39;D&#39;;charMap1[2] &#61; &#39;B&#39;;charMap1[5] &#61; &#39;E&#39;;charMap1[3] &#61; &#39;C&#39;;// Display the contents of the first map.std::cout <<"Contents of first map: " << std::endl;MYMAP::iterator iter;for (iter &#61; charMap1.begin();iter !&#61; charMap1.end(); iter&#43;&#43;){std::cout <<(*iter).first <<" --> ";std::cout <<(*iter).second << std::endl;}std::cout << std::endl;// Create the second map object.
MYMAP charMap2;// Populate the first map with values.charMap2[1] &#61; &#39;F&#39;;charMap2[4] &#61; &#39;I&#39;;charMap2[2] &#61; &#39;G&#39;;charMap2[5] &#61; &#39;J&#39;;charMap2[3] &#61; &#39;H&#39;;// Display the contents of the second map.std::cout <<"Contents of second map: " << std::endl;for (iter &#61; charMap2.begin();iter !&#61; charMap2.end(); iter&#43;&#43;){std::cout <<(*iter).first <<" --> ";std::cout <<(*iter).second << std::endl;}std::cout << std::endl;// Compare the maps.if (charMap1 &#61;&#61; charMap2)std::cout <<"map1 &#61;&#61; map2";else if (charMap1 < charMap2)std::cout <<"map1 ";else if (charMap1 > charMap2)std::cout <<"map1 > map2";return 0;
}

 

7、multimap

View Code

#include
#include
typedef std::multimap<int, char> MYMAP;int main()
{
// Create the first multimap object.
MYMAP charMultimap;// Populate the multimap with values.charMultimap.insert(MYMAP::value_type(1,&#39;A&#39;));charMultimap.insert(MYMAP::value_type(4,&#39;C&#39;));charMultimap.insert(MYMAP::value_type(2,&#39;B&#39;));charMultimap.insert(MYMAP::value_type(7,&#39;E&#39;));charMultimap.insert(MYMAP::value_type(5,&#39;D&#39;));charMultimap.insert(MYMAP::value_type(3,&#39;B&#39;));charMultimap.insert(MYMAP::value_type(6,&#39;D&#39;));// Display the contents of the first multimap.std::cout <<"Contents of first multimap: " << std::endl;MYMAP::iterator iter;for (iter &#61; charMultimap.begin();iter !&#61; charMultimap.end(); iter&#43;&#43;){std::cout <<(*iter).first <<" --> ";std::cout <<(*iter).second << std::endl;}std::cout << std::endl;// Create the second multimap object.
MYMAP charMultimap2;// Populate the second multimap with values.charMultimap2.insert(MYMAP::value_type(1,&#39;C&#39;));charMultimap2.insert(MYMAP::value_type(4,&#39;F&#39;));charMultimap2.insert(MYMAP::value_type(2,&#39;D&#39;));charMultimap2.insert(MYMAP::value_type(7,&#39;E&#39;));charMultimap2.insert(MYMAP::value_type(5,&#39;F&#39;));charMultimap2.insert(MYMAP::value_type(3,&#39;E&#39;));charMultimap2.insert(MYMAP::value_type(6,&#39;G&#39;));// Display the contents of the second multimap.std::cout <<"Contents of second multimap: " << std::endl;for (iter &#61; charMultimap2.begin();iter !&#61; charMultimap2.end(); iter&#43;&#43;){std::cout <<(*iter).first <<" --> ";std::cout <<(*iter).second << std::endl;}std::cout << std::endl;// Compare the multimaps.if (charMultimap &#61;&#61; charMultimap2)std::cout <<"multimap1 &#61;&#61; multimap2";else if (charMultimap < charMultimap2)std::cout <<"multimap1 ";else if (charMultimap > charMultimap2)std::cout <<"multimap1 > multimap2";return 0;
}

 

8、stack

View Code

#include
#include

#include
int main()
{std::stack
<int, std::list<int> > intStack;int x;std::cout <<"Values pushed onto stack:"<< std::endl;for (x&#61;1; x<11; &#43;&#43;x){intStack.push(x*100);std::cout <100 << std::endl;}std::cout <<"Values popped from stack:"<< std::endl;int size &#61; intStack.size();for (x&#61;0; xx){std::cout < std::endl;intStack.pop();}return 0;
}

 

9、queue

View Code

#include
#include

#include
int main()
{std::queue
<int, std::list<int> > intQueue;int x;std::cout <<"Values pushed onto queue:"<< std::endl;for (x&#61;1; x<11; &#43;&#43;x){intQueue.push(x*100);std::cout <100 << std::endl;}std::cout <<"Values removed from queue:"<< std::endl;int size &#61; intQueue.size();for (x&#61;0; xx){std::cout < std::endl;intQueue.pop();}return 0;
}

 

10、priority_queue

View Code

#include
#include

#include
int main()
{std::priority_queue
<int, std::vector<int>,std::greater<int> > intPQueue;int x;intPQueue.push(400);intPQueue.push(100);intPQueue.push(500);intPQueue.push(300);intPQueue.push(200);std::cout <<"Values removed from priority queue:"<< std::endl;int size &#61; intPQueue.size();for (x&#61;0; xx){std::cout < std::endl;intPQueue.pop();}return 0;
}

 


转:https://www.cnblogs.com/TenosDoIt/archive/2013/04/15/3022200.html



推荐阅读
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 春季职场跃迁指南:如何高效利用金三银四跳槽季
    随着每年的‘金三银四’跳槽高峰期的到来,许多职场人士都开始考虑是否应该寻找新的职业机会。本文将探讨如何制定有效的职业规划、撰写吸引人的简历以及掌握面试技巧,助您在这关键时期成功实现职场跃迁。 ... [详细]
  • 基于SSM框架的在线考试系统:随机组卷功能详解
    本文深入探讨了基于SSM(Spring, Spring MVC, MyBatis)框架构建的在线考试系统中,随机组卷功能的设计与实现方法。 ... [详细]
  • Python3爬虫入门:pyspider的基本使用[python爬虫入门]
    Python学习网有大量免费的Python入门教程,欢迎大家来学习。本文主要通过爬取去哪儿网的旅游攻略来给大家介绍pyspid ... [详细]
  • 本文探讨了异步编程的发展历程,从最初的AJAX异步回调到现代的Promise、Generator+Co以及Async/Await等技术。文章详细分析了Promise的工作原理及其源码实现,帮助开发者更好地理解和使用这一重要工具。 ... [详细]
  • 本文介绍了如何利用OpenCV库进行图像的边缘检测,并通过Canny算法提取图像中的边缘。随后,文章详细说明了如何识别图像中的特定形状(如矩形),并应用四点变换技术对目标区域进行透视校正。 ... [详细]
  • hlg_oj_1116_选美大赛这题是最长子序列,然后再求出路径就可以了。开始写的比较乱,用数组什么的,后来用了指针就好办了。现在把代码贴 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 使用Vue指令实现下拉菜单效果
    使用Vue指令实现下拉菜单效果模仿重庆红岩历史革命博物馆官网的导航栏内容和效果,使用Vue实现。官网地址如下:https:www.hongyan.info官网效果效果图片展示代码展 ... [详细]
  • ArcBlock 发布 ABT 节点 1.0.31 版本更新
    2020年11月9日,ArcBlock 区块链基础平台发布了 ABT 节点开发平台的1.0.31版本更新,此次更新带来了多项功能增强与性能优化。 ... [详细]
  • 本文详细介绍了 Redis 中的主要数据类型,包括 String、Hash、List、Set、ZSet、Geo 和 HyperLogLog,并提供了每种类型的基本操作命令和应用场景。 ... [详细]
  • 本文详细介绍如何在 Apache 中设置虚拟主机,包括基本配置和高级设置,帮助用户更好地理解和使用虚拟主机功能。 ... [详细]
  • 本文将探讨一个经典算法问题——最大连续子数组和。我们将从问题定义出发,逐步深入理解其背后的逻辑,并通过实例分析加深理解。 ... [详细]
  • 本文详细介绍了如何在Spring框架中设置事件发布器、定义事件监听器及响应事件的具体步骤。通过实现ApplicationEventPublisherAware接口来创建事件发布器,利用ApplicationEvent类定义自定义事件,并通过ApplicationListener接口来处理这些事件。 ... [详细]
  • 对于初学者而言,搭建一个高效稳定的 Python 开发环境是入门的关键一步。本文将详细介绍如何利用 Anaconda 和 Jupyter Notebook 来构建一个既易于管理又功能强大的开发环境。 ... [详细]
author-avatar
信步老街
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有