标准模板库STL学习总结

合集下载

C++:STL标准入门汇总

C++:STL标准入门汇总

C++:STL标准⼊门汇总学⽆⽌境第⼀部分:(参考百度百科)⼀、STL简介STL(Standard Template Library,标准模板库)是惠普实验室开发的⼀系列软件的统称。

它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室⼯作时所开发出来的。

现在虽说它主要出现在C++中,但在被引⼊C++之前该技术就已经存在了很长的⼀段时间。

STL的代码从⼴义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),⼏乎所有的代码都采⽤了模板类和模版函数的⽅式,这相⽐于传统的由函数和类组成的库来说提供了更好的代码重⽤机会。

在C++标准中,STL被组织为下⾯的13个头⽂件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility>。

⼆、算法⼤家都能取得的⼀个共识是函数库对数据类型的选择对其可重⽤性起着⾄关重要的作⽤。

举例来说,⼀个求⽅根的函数,在使⽤浮点数作为其参数类型的情况下的可重⽤性肯定⽐使⽤整型作为它的参数类性要⾼。

⽽C++通过模板的机制允许推迟对某些类型的选择,直到真正想使⽤模板或者说对模板进⾏特化的时候,STL就利⽤了这⼀点提供了相当多的有⽤算法。

它是在⼀个有效的框架中完成这些算法的——你可以将所有的类型划分为少数的⼏类,然后就可以在模版的参数中使⽤⼀种类型替换掉同⼀种类中的其他类型。

STL提供了⼤约100个实现算法的模版函数,⽐如算法for_each将为指定序列中的每⼀个元素调⽤指定的函数,stable_sort以你所指定的规则对序列进⾏稳定性排序等等。

STL学习心得

STL学习心得

Priority_queuepriority_queue是一种按元素权值大小进行排序的队列的一种数据结构,而在STL中的priority_queue调用 STL里面的 make_heap(), pop_heap(),push_heap() 算法实现,也算是堆的另外一种形式。

priority_queue 对于基本类型的使用方法相对简单。

他的模板声明带有三个参数,priority_queue<Type, Container, Functional>Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。

Container 必须是用数组实现的容器,比如vector, deque 但不能用 list.STL里面默认用的是 vector. 比较方式默认用operator< , 所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。

Priority_queue常用方法有pop(),top(),push(),empty(),size ()。

如果要用到小顶堆,则一般要把模板的三个参数都带进去。

STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆例子:对于自定义类型,则必须自己重载 operator< 或者自己写仿函数。

对于编程人员来说STL是一个强大的工具,不仅提高了代码的重用性,大大降低程序员的工作量,而且减少了代码的行数,使程序更加容易理解,便于维护。

如将第一部分的编写的优先队列代码与用STL中Priority_queue实现的进行对比如下:STL中priority_queue:#include <iostream>#include <queue>using namespace std;int N = 0 ;struct Node{ //自定义的数据类型intnum ;char name[10] ;int priority ;Node(inta,charstr[],int b){num = a ;strcpy(name,str) ;priority = b ;}};bool operator<( Node a, Node b ){ //重载operator<if(a.priority==b.priority)returna.num>b.num ;returna.priority<b.priority ;}int main(){priority_queue<Node> Q; //定义优先队列Q。

STL 简介,标准模板库

STL 简介,标准模板库

2011/4/17STL 简介,标准模板库STL 简介,标准模板库作者:Scott Field 这篇文章是关于C++语言的一个新的扩展——标准模板库的(Standard Template Library),也叫STL。

当我第一次打算写一篇关于STL的文章的时候,我不得不承认我当时低估了这个话题的深度和广度。

有很多内容要含盖,也有很多详细描述STL的书。

因此我重新考虑了一下我原来的想法。

我为什么要写这篇文章,又为什么要投稿呢?这会有什麽用呢?有再来一篇关于STL的文章的必要吗?当我翻开Musser and Saini的页时,我看到了编程时代在我面前消融。

我能看到深夜消失了, 目标软件工程出现了。

我看到了可维护的代码。

一年过去了,我使用STL写的软件仍然很容易维护。

让人吃惊的是其他人可以没有我而维护的很好!然而,我也记得在一开始的时候很难弄懂那些技术术语。

一次,我买了Musser&Saini,每件事都依次出现,但是在那以前我最渴望得到的东西是一些好的例子。

当我开始的时候,作为C++一部分的Stroustrup还没出来,它覆盖了STL。

因此我想写一篇关于一个STL程序员的真实生活的文章可能会有用。

如果我手上有一些好的例子的话,特别是象这样的新题目,我会学的更快。

另外一件事是STL应该很好用。

因此,理论上说,我们应该可以马上开始使用STL。

什麽是STL呢?STL就是Standard Template Library,标准模板库。

这可能是一个历史上最令人兴奋的工具的最无聊的术语。

从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map 等,STL也是算法和其他一些组件的集合。

这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。

STL的目的是标准化组件,这样你就不用重新开发它们了。

你可以仅仅使用这些现成的组件。

STL现在是C++的一部分,因此不用额外安装什麽。

STL学习总结大全

STL学习总结大全

STL就是S‎t andar‎d Templa‎t e Librar‎y,标准模板库。

这可能是一个‎历史上最令人‎兴奋的工具的‎最无聊的术语‎。

从根本上说,STL是一些‎“容器”的集合,这些“容器”有list, vector‎,set,map等,STL也是算‎法和其它一些‎组件的集合。

这里的“容器”和算法的集合‎指的是世界上‎很多聪明人很‎多年的杰作。

是C++标准库的一个‎重要组成部分‎,它由Step‎a nov and Lee等人最‎先开发,它是与C++几乎同时开始‎开发的;一开始STL‎选择了Ada‎作为实现语言‎,但Ada有点‎不争气,最后他们选择‎了C++,C++中已经有了模‎板。

STL又被添‎加进了C++库。

1996年,惠普公司又免‎费公开了ST‎L,为STL的推‎广做了很大的‎贡献。

STL提供了‎类型安全、高效而易用特‎性的STL无‎疑是最值得C‎++程序员骄傲的‎部分。

每一个C++程序员都应该‎好好学习ST‎L。

大体上包括c‎o ntain‎e r(容器)、algori‎t hm(算法)和itera‎t or(迭代器),容器和算法通‎过迭代器可以‎进行无缝连接‎。

一、基础知识1、泛型技术泛型技术的实‎现方法有多种‎,比如模板,多态等。

模板是编译时‎决定,多态是运行时‎决定,其他的比如R‎T TI 也是运‎行时确定。

多态是依靠虚‎表在运行时查‎表实现的。

比如一个类拥‎有虚方法,那么这个类的‎实例的内存起‎始地址就是虚‎表地址,可以把内存起‎始地址强制转‎换成int*,取得虚表,然后(int*)*(int*)取得虚表里的‎第一个函数的‎内存地址,然后强制转换‎成函数类型,即可调用来验‎证虚表机制。

泛型编程(generi‎c progra‎m ming,以下直接以G‎P称呼)是一种全新的‎程序设计思想‎,和OO,OB,PO这些为人‎所熟知的程序‎设计想法不同‎的是GP抽象‎度更高,基于GP设计‎的组件之间偶‎合度底,没有继承关系‎,所以其组件间‎的互交性和扩‎展性都非常高‎。

STL2学习

STL2学习

3.STL与C++标准函数库
STL是最新的C++标准函数库中的一个子集, 这个庞大的子集占据了整个库的大约80%的 分量。 C++标准函数库里包含了哪些内容 :
4.小结“STL”
STL(Standard Template Library,标准模板库) 是惠普实验室开发的一系列软件的统称。 STL的代码从广义上讲分为三类:algorithm(算 法)、container(容器)和iterator(迭代器), 几乎所有的代码都采用了模板类和模版函数的方式 。 在C++标准中,STL被组织为下面的13个头文件: <algorithm>、<deque>、<functional>、 <iterator>、<vector>、<list>、<map>、 <memory>、<numeric>、<queue>、 <set>、<stack>和<utility>。
5.1 第一版
// // // // 比较两个数的大小, 如果*(int *)arg1比*(int *)arg2小,则返回-1 如果*(int *)arg1比*(int *)g2大,则返回1 如果*(int *)arg1等于*(int *)arg2,则返回0
int compare(const void *arg1, const void *arg2)
2.STL与C++
没有C++语言就没有STL ? 一般而言,STL作为一个泛型化的数据结构和 算法库,并不牵涉具体语言(当然,在C++里, 它被称为STL)。 为什么最终还是C++幸运的承担了 STL的实 现工具 ? C++只有在引入了"模板"之后,才直接导致了 STL的诞生。这也正是为什么,用其他比C++ 更纯的面向对象语言无法实现泛型思想的一个 重要原因。

stl标准模板库

stl标准模板库

stl标准模板库STL(Standard Template Library)标准模板库是C++标准库的一部分,它提供了一系列的通用模板类和函数,用于实现常见的数据结构和算法。

STL的设计理念是将数据结构和算法与具体的数据类型分离,使得程序员可以通过简单的方式实现复杂的数据结构和算法。

STL的使用可以大大提高程序的开发效率,同时也能够提高程序的可维护性和可重用性。

STL包含了许多常用的容器类,如vector、list、deque、set、map等,这些容器类提供了不同的数据组织方式,可以满足各种不同的需求。

除了容器类之外,STL还包含了许多常用的算法,如查找、排序、遍历等,这些算法可以直接应用于STL的容器类,为程序员提供了强大的工具库。

STL的设计遵循了泛型编程的思想,通过模板技术实现了通用性和灵活性。

这意味着STL中的大部分组件都是通过模板类和函数实现的,可以适用于各种不同的数据类型。

这种设计使得STL可以在不同的场景下发挥作用,为程序员提供了更多的选择。

在实际的程序开发中,STL的使用非常普遍。

许多常见的数据结构和算法都可以通过STL来实现,无需程序员自己去编写复杂的代码。

这不仅提高了开发效率,还可以减少代码的错误率,提高程序的稳定性。

除了提供了丰富的容器类和算法之外,STL还提供了迭代器(iterator)的概念,通过迭代器可以对容器中的元素进行遍历和访问。

迭代器提供了统一的访问接口,使得程序员可以对容器中的元素进行统一的操作,而不用关心容器的具体实现方式。

总的来说,STL标准模板库是C++程序员不可或缺的工具之一。

它提供了丰富的容器类和算法,可以大大提高程序的开发效率和质量。

同时,STL的设计理念也影响了许多其他编程语言和库的设计,可以说是现代编程中的一个经典范例。

希望通过本文的介绍,读者对STL有一个初步的了解,进而能够在实际的程序开发中灵活运用STL,提高自己的编程水平和工作效率。

标准模板库(STL)

标准模板库(STL)

11.1 标准模板库简介
表11.3 只在第一类中的函数 只在第一类容器中的 函数 begin() end() rbegin() 说明 获得指向被控序列开始处的迭代子, 获得指向被控序列开始处的迭代子,引用容器 第一个元素 获得指向被控序列末端的迭代子, 获得指向被控序列末端的迭代子,引用容器最 后一个元素的后继位置 获得指向被控序列末端的反转型迭代子, 获得指向被控序列末端的反转型迭代子,引用 容器最后一个元素。 容器最后一个元素。实际上这是该容器前后 反转之后的begin() 反转之后的 获得指向被控序列开始处的反转型迭代子, 获得指向被控序列开始处的反转型迭代子,引 用容器第一个元素的前导位置。 用容器第一个元素的前导位置。实际上这是 该容器前后反转之后的end() 该容器前后反转之后的 从容器中清除一个或几个元素 从容器中清除所有元素
后进先出( 后进先出(LIFO) ) 先进先出( 先进先出(FIFO) ) 最高优先级元素总是第一个出列
11.1 标准模板库简介
顺序容器和关联容器称为第一类容器( )。另外有 顺序容器和关联容器称为第一类容器(first-class container)。另外有 )。 四种容器称为近容器( ):C语言风格数组 四种容器称为近容器(near container): 语言风格数组、字符串 ): 语言风格数组、 string、操作 标志值的 标志值的bitset和进行高速数学矢量运算的 和进行高速数学矢量运算的valarray。 、操作1/0标志值的 和进行高速数学矢量运算的 。 它们虽然提供与第一类容器类似的功能,但没有全部功能。 它们虽然提供与第一类容器类似的功能,但没有全部功能。 STL也使容器提供类似的接口。许多基本操作是所有容器都适用的,而有 也使容器提供类似的接口。 也使容器提供类似的接口 许多基本操作是所有容器都适用的, 些操作则适用于类似容器的子集。这样就可以用新的类来扩展STL。这些 些操作则适用于类似容器的子集。这样就可以用新的类来扩展 。 函数和运算符可通称为容器的接口。 函数和运算符可通称为容器的接口。 表11.2 所有标准库容器共有的函数 标准库容器共有的函数 默认构造函数 拷贝构造函数 析构函数 empty() max_size() size() 说明 提供容器默认初始化的构造函数。 提供容器默认初始化的构造函数。通常每个容 器都有几个不同的构造函数, 器都有几个不同的构造函数,提供容器不同 的初始化方法 将容器初始化为现有同类容器副本的构造函数 撤消容器时, 撤消容器时,进行内存处理 判容器是否为空,空返回true,不空返回 不空返回false 判容器是否为空,空返回 不空返回 返回容器中最多允许的元素量 返回容器当前元素量

C++之STL总结精华笔记

C++之STL总结精华笔记

C++之STL总结精华笔记⼀、⼀般介绍STL(StandardTemplate Library),即标准模板库,是⼀个具有⼯业强度的,⾼效的C++程序库。

它被容纳于C++标准程序库(C++Standard Library)中,是ANSI/ISOC++标准中最新的也是极具⾰命性的⼀部分。

该库包含了诸多在计算机科学领域⾥所常⽤的基本数据结构和基本算法。

为⼴⼤C++程序员们提供了⼀个可扩展的应⽤框架,⾼度体现了软件的可复⽤性。

从逻辑层次来看,在STL中体现了泛型化程序设计的思想(genericprogramming),引⼊了诸多新的名词,⽐如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代⼦(iterator)等。

与OOP(object-orientedprogramming)中的多态(polymorphism)⼀样,泛型也是⼀种软件的复⽤技术;从实现层次看,整个STL是以⼀种类型参数化(typeparameterized)的⽅式实现的,这种⽅式基于⼀个在早先C++标准中没有出现的语⾔特性--模板(template)。

如果查阅任何⼀个版本的STL源代码,你就会发现,模板作为构成整个STL的基⽯是⼀件千真万确的事情。

除此之外,还有许多C++的新特性为STL的实现提供了⽅便;⼆、STL的六⼤组件· 容器(Container),是⼀种数据结构,如list,vector,和deques ,以模板类的⽅法提供。

为了访问容器中的数据,可以使⽤由容器类输出的迭代器;· 迭代器(Iterator),提供了访问容器中对象的⽅法。

例如,可以使⽤⼀对迭代器指定list或vector中的⼀定范围的对象。

迭代器就如同⼀个指针。

事实上,C++的指针也是⼀种迭代器。

但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地⽅法的类对象;· 算法(Algorithm),是⽤来操作容器中的数据的模板函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

标准模板库STL学习总结标准模板库就是类与函数模板的大集合.stl共有6种组件:容器,容器适配器,迭代器,算法,函数对象和函数适配器.1、容器:容器是用来存储和组织其他对象的对象.stl容器类的模板在标准头文件中定义.主要如下所示①序列容器基本的序列容器是上面图中的前三类:关于三者的优缺点主要是:a:vector<t>矢量容器:可以随机访问容器的内容,在序列末尾添加或删除对象,但是因为是从尾部删除,过程非常慢,因为必须移动插入或删除点后面的所有对象.矢量容器的操作:(自己以前有个表,贴出来大家看看)其中的capacity表示容量,size是当前数据个数.矢量容器如果用户添加一个元素时容量已满,那么就增加当前容量的一半的内存,比如现在是500了,用户添加进第501个,那么他会再开拓250个,总共就750个了.所以矢量容器当你添加数据量很大的时候,需要注意这一点哦...如果想用迭代器访问元素是比较简单的,使用迭代器输出元素的循环类似如下:vector<int>::iterator表示矢量容器vector<int>的迭代器...for(vector<int>::iteratoriter=number.begin();iter<numb er.end();iter++)//这里的iteratoriter算是一个指针了cout<<""<<*iter;当然也可以用我们自己的方法,但是感觉用上面的更好一些.for(vector<int>::size_typei=0;i<number.size();i++)cout<< ""<<number[i]排序矢量元素:对矢量元素的排序可以使用<algorithm>头文件中定义的sort()函数模板来对一个矢量容器进行排序.但是有几点要求需要注意sort()函数模板用<运算符来排列元素的顺序,所以容器中对象必须可以进行<运算,如果是基本类型,可以直接调用sort(),如果是自定义对象,必须对<进行运算符重载两个迭代器的指向必须是序列的第一个对象和最后一个对象的下一个位置.比如:sort(people.begin(),people.end());//这里两个参数就是迭代器的意思了b:deque<t>容器:非常类似vector<t>,且支持相同的操作,但是它还可以在序列开头添加和删除.deque<t>双端队列容器与矢量容器基本类似,具有相同的函数成员,但是有点不同的是它支持从两端插入和删除数据,所以就有了两个函数:push_front和pop_front.并且有两个迭代器变量#include<deque>deque<int>data;//创建双端队列容器对象deque<int>::iteratoriter;//书序迭代器deque<int>::reverse_iteratorriter;//逆序迭代器.//iter和riter是不同的类型c:list<t>容器是双向链表,因此可以有效的在任何位置添加和删除.列表的缺点是不能随机访问内容,要想访问内容必须在列表的内部从头开始便利内容,或者从尾部开始.②关联容器map<k,t>映射容器:k表示键,t表示对象,根据特定的键映射到对象,可以进行快速的检索.有关它的创建以及查找的操作作如下总结//创建映射容器map<person,string>phonebook;//创建要存储的对象pair<person,string>entry=pair<person,string>(person("mel"," gibson"),"213345567");//插入对象phonebook.insert(entry);//只要映射中没有相同的键,就可以插入entry//访问对象stringnumber=phonebook[person("mel","gibson")];//如果这个键不存在,会默认将这个键插入//如果不想在找不到的时候插入,可以先查找然后再检索personkey=person("mel","gibson");map<person,string>::iterat oriter=phonebook.find(key);//创建迭代器,就认为是指针就好了if(iter!=phonebook.end())stringnumber=iter->second;2、容器适配器:容器适配器是包装了现有的stl容器类的模板类,提供了一个不同的、通常更有限制性的功能.具体如下所示a:queue<t>队列容器:通过适配器实现先进先出的存储机制.我们只能向队列的末尾添加或从开头删除元素.push_back()pop_front()代码:queue<string,list<string>>names;(这就是定义的一个适配器)是基于列表创建队列的.适配器模板的第二个类型形参指定要使用的底层序列容器,主要的操作如下b:priority_queue<t>优先级队列容器:是一个队列,它的顶部总是具有最大或最高优先级.优先级队列容器与队列容器一个不同点是优先级队列容器不能访问队列后端的元素.默认情况下,优先级队列适配器类使用的是矢量容器vector<t>,当然可以选择指定不同的序列容器作为基础,并选择一个备用函数对象来确定元素的优先级代码如下priority_queue<int,deque<int>,greate<int>>numbers;c:stack<t>堆栈容器:其适配器模板在<stack>头文件中定义,默认情况下基于deque<t>容器实现向下推栈,即后进先出机制.只能访问最近刚刚进去的对象//定义容器stack<person>people;//基于列表来定义堆栈stack<string,list<string>>names;基本操作如下:3、迭代器:具体它的意思还没怎么看明白,书上介绍迭代器的行为与指针类似,这里做个标记具体分为三个部分:输入流迭代器、插入迭代器和输出流迭代器.看这一章的内容看的我有点抑郁了都,摘段课本介绍的内容,还是可以帮助理解的<iterator>头文件中定义了迭代器的几个模板:①流迭代器作为指向输入或输出流的指针,他们可以用来在流和任何使用迭代器或目的地之间传输数据.②插入迭代器可以将数据传输给一个基本序列容器.头文件中定义了两个流迭代器模板:istream_iterator<t>用于输入流,ostream_iterator<t>用于输出流.t表示从流中提取数据或写到流中的对象的类型.头文件还定义了三个插入模板:insert<t>,back_insert<t>和front_inset<t>.其中t也是指代序列容器中数据的类型.输入流迭代器用下面的程序来说明下,可见具体注释#include<iostream>#include<vector>#include<numeric>#incl ude<sstream>usingnamespacestd;intmain(){//定义矢量容器vector<int>numbers;cout<<"请输入整数值,以字母结束:";//定义输入流迭代器.注意两个不同//1、numberinput(cin)是指定迭代器指向流cin//2、numbersend没有指定,是默认的,默认构造了一个end_of_stream的迭代器,它等价于调用end()istream_iterator<int>numbersinput(cin),numbersend;//用户输入,直到输入的不是int类型或者终止时结束.while(numbersinput!=numbersend)numbers.push_back(*number sinput++);cout<<"打印输出:"<<numbers.at(3)<<endl;//如何指定输入流呢?//确定字符串stringdata("2.13.636.52634252.963.8");//指定data为输入流input.需要头文件<sstream>istringstreaminput(data);//定义迭代器istream_iterator<double>begin(input),end;//计算数值和.//acculumate为头文件<numeric>下定义的函数.//第一个参数是开始迭代器,第二个是终止迭代器(最后一个值的下一个).第三个是和的初值,注意必须用0.0,用它确定数据类型是doublecout<<"打印数据的总和:"<<accumulate(begin,end,0.0)<<endl;}输出结果:耽误时间太多.以后再写吧4、算法:算法是操作迭代器提供的一组对象的stl函数模板,对对象的一个操作,可以与前面的容器迭代器结合起来看.如下图介绍5、函数对象:函数对象是重载()运算符的类类型的对象.就是实现operator()()函数.函数对象模板在<functional>头文件中定义,必要时我们也可以定义自己的函数对象.做个标记6、函数适配器:函数适配器是允许合并函数对象以产生一个更复杂的函数对象的函数模板.版权声明:本文为博主原创文章,未经博主允许不得转载.。

相关文档
最新文档