标准模板库STL学习总结

标准模板库就是类与函数模板的大集合。STL共有6种组件:容器,容器适配器,迭代器,算法,函数对象和函数适配器。

1、容器:

容器是用来存储和组织其他对象的对象。STL容器类的模板在标准头文件中定义。主要如下所示

①序列容器

基本的序列容器是上面图中的前三类:


关于三者的优缺点主要是:

A:vector<T>矢量容器:可以随机访问容器的内容,在序列末尾添加或删除对象,但是因为是从尾部删除,过程非常慢,因为必须移动插入或删除点后面的所有对象。


矢量容器的操作:(自己以前有个表,贴出来大家看看)


其中的capacity表示容量,size是当前数据个数。矢量容器如果用户添加一个元素时容量已满,那么就增加当前容量的一半的内存,比如现在是500了,用户添加进第501个,那么他会再开拓250个,总共就750个了。所以矢量容器当你添加数据量很大的时候,需要注意这一点哦。。。


如果想用迭代器访问元素是比较简单的,使用迭代器输出元素的循环类似如下:

[cpp] view plaincopy
  1. vector<int>::iterator表示矢量容器vector<int>的迭代器。。。  
[cpp] view plaincopy
  1. for(vector<int>::iterator iter = number.begin(); iter<number.end(); iter++)//这里的iterator iter算是一个指针了  
  2.      cout << " " << *iter;  
当然也可以用我们自己的方法,但是感觉用上面的更好一些。

[cpp] view plaincopy
  1. for(vector<int>::size_type i=0; i<number.size(); i++)  
  2.     cout << " " << number[i]  



排序矢量元素:

对矢量元素的排序可以使用<algorithm>头文件中定义的sort()函数模板来对一个矢量容器进行排序。但是有几点要求需要注意

  1. sort()函数模板用<运算符来排列元素的顺序,所以容器中对象必须可以进行<运算,如果是基本类型,可以直接调用sort(),如果是自定义对象,必须对<进行运算符重载
  2. 两个迭代器的指向必须是序列的第一个对象和最后一个对象的下一个位置。比如:sort(people.begin(), people.end());//这里两个参数就是迭代器的意思了

B:deque<T>容器:非常类似vector<T>,且支持相同的操作,但是它还可以在序列开头添加和删除。


deque<T>双端队列容器与矢量容器基本类似,具有相同的函数成员,但是有点不同的是它支持从两端插入和删除数据,所以就有了两个函数:push_front和pop_front。并且有两个迭代器变量

[cpp] view plaincopy
  1. <span style="font-size:18px;">#include <deque>  
  2. deque<int> data;//创建双端队列容器对象  
  3. deque<int>::iterator iter;//书序迭代器  
  4. deque<int>::reverse_iterator riter;//逆序迭代器。  
  5. //iter和riter是不同的类型</span>  


C:list<T>容器是双向链表,因此可以有效的在任何位置添加和删除。列表的缺点是不能随机访问内容,要想访问内容必须在列表的内部从头开始便利内容,或者从尾部开始。




②关联容器

map<K, T>映射容器:K表示键,T表示对象,根据特定的键映射到对象,可以进行快速的检索。

有关它的创建以及查找的操作作如下总结

[cpp] view plaincopy
  1. //创建映射容器  
  2. map<person, string> phonebook;  
  3.   
  4. //创建要存储的对象  
  5. pair<person, string> entry = pair<person, string>(person("mel""Gibson"), "213 345 567");  
  6.   
  7. //插入对象  
  8. phonebook.insert(entry);//只要映射中没有相同的键,就可以插入entry  
  9.   
  10. //访问对象  
  11. string number = phonebook[person("mel""Gibson")];//如果这个键不存在,会默认将这个键插入  
  12.   
  13. //如果不想在找不到的时候插入,可以先查找然后再检索  
  14. person key = person("mel""Gibson");  
  15. map<person, string>::iterator iter = phonebook.find(key);//创建迭代器,就认为是指针就好了  
  16.   
  17. if(iter != phonebook.end())  
  18.     string  number = iter->second;  



2、容器适配器:

容器适配器是包装了现有的STL容器类的模板类,提供了一个不同的、通常更有限制性的功能。具体如下所示


A:queue<T>队列容器:通过适配器实现先进先出的存储机制。我们只能向队列的末尾添加或从开头删除元素。push_back() pop_front()

代码:queue<string, list<string> > names;(这就是定义的一个适配器)是基于列表创建队列的。适配器模板的第二个类型形参指定要使用的底层序列容器,主要的操作如下


B:priority_queue<T>优先级队列容器:是一个队列,它的顶部总是具有最大或最高优先级。优先级队列容器与队列容器一个不同点是优先级队列容器不能访问队列后端的元素。

默认情况下,优先级队列适配器类使用的是矢量容器vector<T>,当然可以选择指定不同的序列容器作为基础,并选择一个备用函数对象来确定元素的优先级代码如下

[cpp] view plaincopy
  1. priority_queue<int, deque<int>, greate<int>> numbers;  

C:stack<T>堆栈容器:其适配器模板在<stack>头文件中定义,默认情况下基于deque<T>容器实现向下推栈,即后进先出机制。只能访问最近刚刚进去的对象

[cpp] view plaincopy
  1. <span style="font-size:18px;">//定义容器  
  2. stack<person> people;  
  3. //基于列表来定义堆栈  
  4. stack<string, list<string>> names;</span>  

基本操作如下:



3、迭代器:

具体它的意思还没怎么看明白,书上介绍迭代器的行为与指针类似,这里做个标记奋斗,看看后面的例子再给出具体的解释

具体分为三个部分:输入流迭代器、插入迭代器和输出流迭代器。

看这一章的内容看的我有点抑郁了都,摘段课本介绍的内容,还是可以帮助理解的

<iterator>头文件中定义了迭代器的几个模板:①流迭代器作为指向输入或输出流的指针,他们可以用来在流和任何使用迭代器或目的地之间传输数据。②插入迭代器可以将数据传输给一个基本序列容器。头文件中定义了两个流迭代器模板:istream_iterator<T>用于输入流,ostream_iterator<T>用于输出流。T表示从流中提取数据或写到流中的对象的类型。头文件还定义了三个插入模板:insert<T>, back_insert<T>和front_inset<T>。其中T也是指代序列容器中数据的类型。

输入流迭代器用下面的程序来说明下,可见具体注释

[cpp] view plaincopy
  1. #include <iostream>    
  2. #include <vector>  
  3. #include <numeric>  
  4. #include <sstream>  
  5.   
  6. using namespace std;    
  7.    
  8. int main()  
  9. {  
  10.     //定义矢量容器  
  11.     vector<int> numbers;  
  12.     cout << "请输入整数值,以字母结束:";  
  13.   
  14.     //定义输入流迭代器。注意两个不同  
  15.     //1、numberInput(cin)是指定迭代器指向流cin  
  16.     //2、numbersEnd没有指定,是默认的,默认构造了一个end_of_stream的迭代器,它等价于调用end()  
  17.     istream_iterator<int> numbersInput(cin), numbersEnd;  
  18.   
  19.     //用户输入,直到输入的不是int类型或者终止时结束。   
  20.     while(numbersInput != numbersEnd)  
  21.         numbers.push_back(*numbersInput++);  
  22.   
  23.     cout << "打印输出:" << numbers.at(3) << endl;  
  24.   
  25.   
  26.     //如何指定输入流呢?  
  27.       
  28.     //确定字符串  
  29.     string data("2.1 3.6 36.5 26 34 25 2.9 63.8");  
  30.   
  31.     //指定data为输入流input。需要头文件<sstream>  
  32.     istringstream input(data);  
  33.   
  34.     //定义迭代器  
  35.     istream_iterator<double> begin(input), end;  
  36.   
  37.     //计算数值和。  
  38.     //acculumate为头文件<numeric>下定义的函数。  
  39.     //第一个参数是开始迭代器,第二个是终止迭代器(最后一个值的下一个)。第三个是和的初值,注意必须用0.0,用它确定数据类型是double  
  40.     cout << "打印数据的总和:" << accumulate(begin, end, 0.0) << endl;  
  41. }  

输出结果:

耽误时间太多。以后再写吧

4、算法:

算法是操作迭代器提供的一组对象的STL函数模板,对对象的一个操作,可以与前面的容器迭代器结合起来看。如下图介绍


5、函数对象:

函数对象是重载()运算符的类类型的对象。就是实现operator()()函数。

函数对象模板在<functional>头文件中定义,必要时我们也可以定义自己的函数对象。做个标记奋斗,等有具体实例来进行进一步的解释。

6、函数适配器:

函数适配器是允许合并函数对象以产生一个更复杂的函数对象的函数模板。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MicroRNA Ranking(Tehran2016)

题意&#xff1a;给出m个n的全排列&#xff0c;求一个n的全排列&#xff0c;满足对于i<j&#xff0c;至少存在一半的全排列中&#xff0c;ai排在aj的前面&#xff0c;求字典序最小方案&#xff0c;或者是无解。 (1)首先我们对 vis[ a[i] ][ a[j] ] ,求出a[i] 对 a[j] 的贡献…

linux gpt引导分区,linux 引导gpt分区windows及clover

原因&#xff1a;电脑采用gpt分区&#xff0c;安装了win10linux(debian)mac 10.11(El capitan),使用clover做引导器时&#xff0c;可以引导linux和mac,但通过bootmgfw.efi引导win10时无限转圈,不能正常启动win10。所以考虑用linux的grubx引导器。1、引导Clocer查看clover所在EF…

查看表状态及索引碎片语句

语句&#xff1a;DBCC SHOWCONTIG (SrMissedCalls) WITH ALL_INDEXES&#xff1b; 其中‘SrMissedCalls’是表名字。 执行之后展示内容&#xff1a; 转载于:https://www.cnblogs.com/shendaxian/p/9604826.html

visualvm远程jvm_VisualVM:通过SSH监视远程JVM(是否为JMX)

visualvm远程jvmVisualVM是用于监视JVM&#xff08;5.0&#xff09;的有关内存使用&#xff0c;线程&#xff0c;GC&#xff0c;MBeans等的出色工具。让我们看看如何通过SSH使用它来监视&#xff08;甚至使用JMX进行配置&#xff09;使用JMX或不使用JMX的远程JVM。它。 这篇文章…

如何切换pip的源

参考别人的帖子https://blog.csdn.net/chenghuikai/article/details/55258957 转载于:https://www.cnblogs.com/PoeticalJustice/p/9609659.html

shp文件的读取

转载自&#xff1a;http://blog.csdn.net/gisfarmer/article/details/3861554做GIS开发的朋友可能对shp并不陌生&#xff0c;但是看到CSDN网友不断提问关于shp文件的一些问题&#xff0c;利用闲暇我对shp文件的一些知识加以总结&#xff0c;共享CSDN网友。首先了解一下shp文件的…

Java 8:CompletableFuture与并行流

这篇文章展示了Java 8的CompletableFuture在执行异步计算时如何与并行流进行比较。 我们将使用以下类对长时间运行的任务进行建模&#xff1a; class MyTask {private final int duration;public MyTask(int duration) {this.duration duration;}public int calculate() {Sy…

linux使用gpio开一个线程,LINUX的gpio_request_one作用

一直习惯使用gpio_request来申请一个GPIO&#xff0c;然后用gpio_direction_input、gpio_direction_output等函数来配置对应的GPIO&#xff0c;用gpio_free来释放申请。后来看到别人也会用gpio_request_one来申请和配置一个GPIO&#xff0c;然后就去看看看这个接口的实现&#…

Python制作回合制手游外挂简单教程(下)

引入&#xff1a; 接着上篇的博文&#xff0c;今天我们讲如何实现助人为乐 前期准备&#xff1a; 如何获取图片中指定文字的坐标&#xff1f; 我的思路是截取一个小区域&#xff0c;再根据小区域左上角的坐标获取中央坐标 例如&#xff1a; 获取坐上角的x和y坐标&#xff0c;测…

XSHELL下直接下载文件到本地(Windows)

转载自&#xff1a;http://www.cnblogs.com/davytitan/p/3966606.html xshell很好用,然后有时候想在windows和linux上传或下载某个文件,其实有个很简单的方法就是rz,sz 首先你的Ubuntu需要安装rz.sz(如果没有安装请执行以下命令,安装完的请跳过.其它版本linux请自行安装相应软…

linux操作系统2试题,RedHat Linux 9.0 操作系统测试题2

一、填空题(每空1分&#xff0c;共14分)1.任何Linux系统都至少需要两类分区&#xff1a;根分区和交换分区。2.CD-ROM标准的文件系统是iso9660。3.使用vi编辑器可以创建文本文件&#xff0c;在输入文件内容之前需要先按INSERT键进入插入模式&#xff0c;在保存之前需下先使用ESC…

HazelCast的Spring-Boot和Cache抽象

以前&#xff0c;我们是使用spring提供的默认Cache Manager来开始Spring Cache抽象的。 尽管这种方法可能适合我们对简单应用程序的需求&#xff0c;但是在出现复杂问题的情况下&#xff0c;我们需要使用具有更多功能的其他工具。 Hazelcast就是其中之一。 当涉及到基于JVM的应…

Ubuntu18.04 安装搜狗输入法后无法启动的问题

ibus 改选成fcitx后搜狗输入法照样没出来。 这里需要im-config 没有的话需要安装&#xff1a; sudo apt install im-config 然后在Terminal中执行 im-config 根据提示选择fcitx转载于:https://www.cnblogs.com/feipeng8848/p/9609877.html

linux华为路由器模拟器,华为路由器模拟器与实验内容.doc

华为路由器模拟器与实验内容华为的路由器模拟器及实验内容??2009-12-21 20:27:53|??分类&#xff1a; HYPERLINK "/ah..zhangrui/blog/" \l "m0&t1&cfks_080074086080086074092094074070087095083070092086084" \o "默认分类" 默认分…

_WIN32_WCE有什么用

转载自&#xff1a;http://blog.csdn.net/thanklife/article/details/21477561 _WIN32_WCE有什么用,我这里找了一些人的回应。由于目前我手头的源码有限&#xff0c;还没有找到定义之处。先这样保留着这个问题吧。以下是一些别人给的认识。 经常看到 #ifndef _WIN32_WCE 这是什…

zk ui_高级ZK:异步UI更新和后台处理–第1部分

zk ui异步UI更新非常有用&#xff0c;因为它们通常可以提高响应性&#xff0c;可用性和用户界面的总体感觉。 我将在这里重点介绍ZK框架&#xff0c;但是通常&#xff0c;相同的原理也适用于桌面UI&#xff08;Swing&#xff0c;SWT&#xff09;。 长时间运行的处理 有时您可能…

BZOJ 3223: Tyvj 1729 文艺平衡树-Splay树(区间翻转)模板题

3223: Tyvj 1729 文艺平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6881 Solved: 4213[Submit][Status][Discuss]Description 您需要写一种数据结构&#xff08;可参考题目标题&#xff09;&#xff0c;来维护一个有序数列&#xff0c;其中需要提供以下操作&#…

在Spring中了解事务注释

1.简介 Spring为程序性和声明性事务提供支持。 1.1程序化交易 对于程序性事务&#xff0c;需要显式编写事务管理代码&#xff0c;以便在一切成功后提交&#xff0c;并在出现问题时回滚。 在这种情况下&#xff0c;事务管理代码与业务逻辑紧密绑定。 1.2声明式交易 声明式事…

GIS开源库shapeLib的使用方法

转自&#xff1a;http://www.cnblogs.com/liongis/archive/2012/10/23/2736015.html 近期研究了一下GIS开源库shapeLib读写ArcGIS数据的API函数&#xff0c;先整理一下&#xff0c;将各个API的用法介绍一下。 分为两个模块&#xff0c;shape API和DBF API&#xff0c;前者的读取…

linux 升级 iphone,Linux 5.13 更新有望增加对苹果 M1 处理器的支持

IT之家 4 月 10 日消息 预计 Linux 5.13 将初步支持苹果 Silicon M1 处理器&#xff0c;不过可能还需要几年时间才能完全支持。虽然已经在苹果 Silicon M1 上运行&#xff0c;但这是通过一系列的补丁&#xff0c;单纯是为了 Linux 能够在 M1 设备上启动而已&#xff0c;而现在 …