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



推荐阅读
  • 丽江客栈选择问题
    本文介绍了一道经典的算法题,题目涉及在丽江河边的n家特色客栈中选择住宿方案。两位游客希望住在色调相同的两家客栈,并在晚上选择一家最低消费不超过p元的咖啡店小聚。我们将详细探讨如何计算满足条件的住宿方案总数。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 本问题探讨了在特定条件下排列儿童队伍的方法数量。题目要求计算满足条件的队伍排列总数,并使用递推算法和大数处理技术来解决这一问题。 ... [详细]
  • 本教程详细介绍了如何使用 TensorFlow 2.0 构建和训练多层感知机(MLP)网络,涵盖回归和分类任务。通过具体示例和代码实现,帮助初学者快速掌握 TensorFlow 的核心概念和操作。 ... [详细]
  • Splay Tree 区间操作优化
    本文详细介绍了使用Splay Tree进行区间操作的实现方法,包括插入、删除、修改、翻转和求和等操作。通过这些操作,可以高效地处理动态序列问题,并且代码实现具有一定的挑战性,有助于编程能力的提升。 ... [详细]
  • 本文详细介绍了 Apache Jena 库中的 Txn.executeWrite 方法,通过多个实际代码示例展示了其在不同场景下的应用,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 题目Link题目学习link1题目学习link2题目学习link3%%%受益匪浅!-----&# ... [详细]
  • 本文提供了一系列Python编程基础练习题,涵盖了列表操作、循环结构、字符串处理和元组特性等内容。通过这些练习题,读者可以巩固对Python语言的理解并提升编程技能。 ... [详细]
  • 本文深入探讨了POJ2762问题,旨在通过强连通分量缩点和单向连通性的判断方法,解决有向图中任意两点之间的可达性问题。文章详细介绍了算法原理、实现步骤,并附带完整的代码示例。 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
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社区 版权所有