热门标签 | 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



推荐阅读
  • 本文详细探讨了HTML表单中GET和POST请求的区别,包括它们的工作原理、数据传输方式、安全性及适用场景。同时,通过实例展示了如何在Servlet中处理这两种请求。 ... [详细]
  • 本文深入探讨 MyBatis 中动态 SQL 的使用方法,包括 if/where、trim 自定义字符串截取规则、choose 分支选择、封装查询和修改条件的 where/set 标签、批量处理的 foreach 标签以及内置参数和 bind 的用法。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 基于KVM的SRIOV直通配置及性能测试
    SRIOV介绍、VF直通配置,以及包转发率性能测试小慢哥的原创文章,欢迎转载目录?1.SRIOV介绍?2.环境说明?3.开启SRIOV?4.生成VF?5.VF ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本题通过将每个矩形视为一个节点,根据其相对位置构建拓扑图,并利用深度优先搜索(DFS)或状态压缩动态规划(DP)求解最小涂色次数。本文详细解析了该问题的建模思路与算法实现。 ... [详细]
  • 火星商店问题:线段树分治与持久化Trie树的应用
    本题涉及编号为1至n的火星商店,每个商店有一个永久商品价值v。操作包括每天在指定商店增加一个新商品,以及查询某段时间内某些商店中所有商品(含永久商品)与给定密码值的最大异或结果。通过线段树分治和持久化Trie树来高效解决此问题。 ... [详细]
  • 在前两篇文章中,我们探讨了 ControllerDescriptor 和 ActionDescriptor 这两个描述对象,分别对应控制器和操作方法。本文将基于 MVC3 源码进一步分析 ParameterDescriptor,即用于描述 Action 方法参数的对象,并详细介绍其工作原理。 ... [详细]
  • 从 .NET 转 Java 的自学之路:IO 流基础篇
    本文详细介绍了 Java 中的 IO 流,包括字节流和字符流的基本概念及其操作方式。探讨了如何处理不同类型的文件数据,并结合编码机制确保字符数据的正确读写。同时,文中还涵盖了装饰设计模式的应用,以及多种常见的 IO 操作实例。 ... [详细]
  • 尽管使用TensorFlow和PyTorch等成熟框架可以显著降低实现递归神经网络(RNN)的门槛,但对于初学者来说,理解其底层原理至关重要。本文将引导您使用NumPy从头构建一个用于自然语言处理(NLP)的RNN模型。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
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社区 版权所有