标准模板库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),是⽤来操作容器中的数据的模板函数。

c++stl使用方法总结

c++stl使用方法总结

c++stl使用方法总结C++标准模板库(STL)是C++的一个重要组成部分,提供了许多常用的数据结构和算法。

下面是对C++ STL使用方法的总结:1. 容器(Containers):vector,可变大小的动态数组,使用push_back()添加元素,使用下标访问元素。

list,双向链表,使用push_back()和push_front()添加元素,使用迭代器访问元素。

deque,双端队列,类似于vector,但可以在前后两端高效地添加和删除元素。

set,有序集合,不允许重复元素,使用insert()插入元素,使用迭代器访问元素。

map,有序键值对集合,不允许重复键,使用insert()插入键值对,使用迭代器访问元素。

unordered_set,无序集合,使用哈希表实现,不允许重复元素。

unordered_map,无序键值对集合,使用哈希表实现,不允许重复键。

2. 迭代器(Iterators):迭代器用于遍历容器中的元素,可以使用begin()和end()获取容器的起始和结束迭代器。

迭代器可以使用自增运算符(++)向前遍历容器中的元素,也可以使用解引用运算符()访问迭代器指向的元素。

3. 算法(Algorithms):STL提供了大量的算法,如排序、查找、拷贝、删除等。

使用算法需要包含<algorithm>头文件,例如使用sort()进行排序,使用find()进行查找。

4. 函数对象(Function Objects):函数对象是可调用对象,可以像函数一样使用。

STL提供了一些内置函数对象,如less、greater等,也可以自定义函数对象。

5. 仿函数(Functors):仿函数是一种特殊的函数对象,可以像函数一样使用,可以包含状态。

仿函数可以重载函数调用运算符(operator()),使其可以像函数一样被调用。

6. 算法调用:使用算法时,通常需要提供迭代器作为参数,指定算法的操作范围。

c++STL总结

c++STL总结
1.8 迭代器(iterator)
1.8.1 迭代器的特点 (示例:iterator)
(1)可遍历 STL 容器内全部或部分元素的对象。 (2)指出容器中的一个特定位置。 (3)迭代器的基本操作:
(4)所有容器都提供获得迭代器的函数
6
2016 年 3 月 8 日 [C++ STL 学习总结]
半开区间[beg, end)的好处: 1.为遍历元素时循环的结束时机提供了简单的判断依据(只要未到达 end(),循环就可以继续)。
} 1.2.2 类模板 //类模板 #include<iostream> using namespace std; //定义名为 ex_class 的类模板 template <typename T> class ex_class{
T value; public:
ex_class(T v){ value = v;
1.4 STL 容器类别
(1)序列式容器----排列次序取决于插入时机和位置 。 (2)关联式容器----排列顺序取决于特定准则。
1.5 STL 容器的共通能力
(1)所有容器中存放的都是值而非引用,即容器进行安插操作时内部实施的是拷贝操作。因此容器的每个元素必 须能够被拷贝。如果希望存放的不是副本,容器元素只能是指针。 (2)所有元素都形成一个次序(order),可以按相同的次序一次或多次遍历每个元素。 (3)各项操作并非绝对安全,调用者必须确保传给操作函数的参数符合需求,否则会导致未定义的行为。 1.6 STL 容器元素的条件 (1)必须能够通过拷贝构造函数进行复制。 (2)必须可以通过赋值运算符完成赋值操作。 (3)必须可以通过析构函数完称销毁动作。 (4)序列式容器元素的默认构造函数必须可用。 (5)某些动作必须定义 operator ==,例如搜寻操作。

stl标准库

stl标准库

stl标准库STL(Standard Template Library)标准库是C++语言中的一个非常重要的组成部分,它为程序员提供了丰富的数据结构和算法,极大地提高了程序的开发效率和质量。

STL标准库包括了许多容器、迭代器、算法等组件,它们可以帮助程序员轻松地实现各种功能,从而简化了程序的开发过程。

本文将对STL标准库进行详细介绍,包括其组成部分、常用容器和算法等内容。

STL标准库的组成部分主要包括容器、迭代器、算法和函数对象。

容器是STL中最基本的组件,它用来存储数据,并提供了对数据的访问和操作接口。

常用的容器包括vector、list、deque、stack、queue、set、map等,它们分别对应了动态数组、链表、双端队列、栈、队列、集合和映射等数据结构。

迭代器是STL中用来遍历容器中元素的工具,它提供了统一的访问接口,使得程序员可以以统一的方式来访问不同类型的容器。

算法是STL中的另一个重要组件,它包括了大量的常用算法,如查找、排序、合并、删除等,可以直接应用于各种容器中的数据。

函数对象是STL中的一个重要概念,它是一种可调用对象,可以像函数一样被调用,通常用来作为算法的参数,用于指定算法的操作方式。

在STL标准库中,容器是其中最重要的部分之一。

vector是STL中最常用的容器之一,它是一个动态数组,可以根据需要动态扩展和收缩,非常适合于需要频繁插入和删除操作的场景。

list是另一个常用的容器,它是一个双向链表,可以快速地进行插入和删除操作,但在随机访问时性能较差。

deque是双端队列,可以在两端进行快速插入和删除操作,比vector和list都要高效。

除了这些基本容器外,STL标准库还提供了stack、queue、set、map等容器,它们分别对应了栈、队列、集合和映射等数据结构,可以满足不同场景下的需求。

除了容器外,STL标准库中的算法也是其核心部分之一。

STL中提供了大量的常用算法,如查找、排序、合并、删除等,它们可以直接应用于各种容器中的数据,极大地提高了程序员的开发效率。

第13章 标准模板库(STL)

第13章  标准模板库(STL)
• STL是一项比较新的技术,VC6是微软公司比较老 的一款编译器,其对STL的支持并不是太好,因此, 在本章学习时,推荐采用较新的VC2005甚至是 VC2008编译器。
13.1 理解STL
• STL库是用摸板(template)写出来的,在第12章 中也已经提及:模板是STL库的基础所在,大致来 说,STL是由三部分组成的:
始化,编译器使用默认值为元素隐式初始化,像int、float和double等内 建的数据类型会被初始化为0,对于类对象元素,将调用其无参构造函数 (用户定义的或编译器缺省提供的)或每个参数都有默认值的构造函数。 • (3)在(2)的基础上更进一步,创建特定大小的容器,并且为其中的每 个元素指定初始值,此时在元素多少的参数后增加一个参数。 • (4)根据已有同类型的容器创建新容器,并将其中的元素完全复制过来, 设obV1、obL1和obD1都是现成的容器,里面存储的数据均为int型,则可 用下述命令创建新容器。 • (5)通过一对迭代器(可暂时理解为指针),以使编译器决定元素的个 数和出值,这对迭代器用以标识一组元素区间。
13.2.4 vector容器
• 介绍完vector、list以及deque的通用用法,下面 分别讨论下其特别之处。首先是vector,字面翻 译为向量,其用法类似于前面介绍的数组,但其 功能比数组更强大。简单地说,vector是数组的 类表示,它提供了自动管理内存的功能,可以动 态改变vector对象的长度,并随着元素的增删而 增大或缩小,提供了对元素的随机访问,和数组 一样,在vector尾部添加和删除元素(push_back 和pop_back)的时间是固定的,但在vector中间 或头部增删元素(insert,erase)的时间和复杂度 线性比于vector容器对象中元素的多少。

标准模板库

标准模板库

标准模板库标准模板库,也叫STL,是一个 C++ 容器类库,算法和迭代器。

他提供许多基本算法,数据结构。

STL 是一个通用库,即可以充份定制:几乎所有的 STL 组件都是模板。

在你使用 STL 前,你必须了解模板的工作情况。

容器和算法和许多类库一样,STL 包含容器类 - 可以包含其他对象的类。

STL 包含向量类,链表类,双向队列类,集合类,图类,等等。

他们中的每个类都是模板,能包含各种类型的对象。

例如,你可以用 vector<int> ,就象常规的 C 语言中的数组,除了 vector 不要你象数组那样考虑到动态内存分配的问题。

vector<int> v(3); // 定义一个有三个元素的向量类v[0] = 7;v[1] = v[0] + 3;v[2] = v[0] + v[1]; // v[0] == 7, v[1] == 10, v[2] == 17STL 还包含了大量的算法。

他们巧妙地处理储存在容器中的数据。

你能够颠倒vector 中的元素,只是简单使用 reverse 算法。

reverse(v.begin(), v.end()); // v[0] == 17, v[1] == 10, v[2] == 7在调用 reverse 的时候有两点要注意。

首先,他是个全局函数,而不是成员函数。

其次,他有两个参数,而不是一个:他操作一定范围的元素而不是操作容器。

在这个例子中他正好是对整个容器 V 操作。

以上两点的原因是相同的:reverse 和其他 STL 算法一样,他们是通用的,也就是说, reverse 不仅可以用来颠倒向量的元素,也可以颠倒链表中元素的顺序。

甚至可以对数组操作。

下面的程序是合法的。

double A[6] = { 1.2, 1.3, 1.4, 1.5, 1.6, 1.7 };reverse(A, A + 6);for (int i = 0; i < 6; ++i)cout << "A[" << i << "] = " << A[i];这个例子也用到了范围,和我们上面的向量的例子一样:第一个参数是指向要操作的范围的头的指针,第二个参数是指向尾的指针。

stl标准模板库

stl标准模板库

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

STL的设计理念是将数据结构和算法进行有效地组织和封装,使得程序员可以更加高效地进行软件开发,同时也提高了代码的可重用性和可维护性。

STL包含了多个重要的组件,包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)和函数对象(Function Objects)。

这些组件为C++程序员提供了丰富的工具,可以方便地进行数据操作和算法实现。

首先,容器是STL中最重要的组件之一,它提供了多种数据结构,如向量(vector)、链表(list)、集合(set)、映射(map)等。

这些容器可以存储不同类型的数据,并且提供了丰富的操作方法,例如插入、删除、查找等。

使用STL容器可以大大简化数据结构的实现和管理,提高了程序的效率和可维护性。

其次,迭代器是STL中用于遍历容器中元素的重要工具,它提供了统一的接口,使得程序员可以方便地对容器中的元素进行访问和操作。

通过迭代器,程序员可以实现对容器中元素的遍历、查找、排序等操作,极大地提高了代码的可读性和可维护性。

另外,STL还提供了丰富的算法,如排序、查找、合并、计数等。

这些算法可以直接应用于STL容器中,极大地简化了程序员的工作,同时也提高了代码的效率和可维护性。

通过使用STL算法,程序员可以快速地实现各种常见的数据操作,而不需要重复编写相似的代码。

最后,函数对象是STL中的另一个重要组件,它提供了一种灵活的机制,可以方便地实现各种算法和操作。

函数对象可以作为参数传递给STL算法,从而实现各种定制化的操作。

通过使用函数对象,程序员可以更加灵活地实现各种复杂的逻辑,提高了代码的可复用性和可扩展性。

总之,STL标准模板库为C++程序员提供了丰富的工具,可以大大简化数据结构和算法的实现,提高了代码的效率和可维护性。

关于C++标准模板库(STL)的一些基本使用

关于C++标准模板库(STL)的一些基本使用

关于C++标准模板库(STL)的⼀些基本使⽤vectorvector可以理解成变长数组,即长度根据需要⽽⾃动改变的数组头⽂件:#include <vector>定义:vector<typename>name;vector内可以通过下标或者迭代器(iterator)访问(只有vector和string才允许使⽤v.begin()+3这种迭代器加整数的写法) v.push_back(value) 时间复杂度:O(1)v.pop_back() 时间复杂度:O(1)v.size() 返回的是unsigned类型时间复杂度:O(1)v.clear() 时间复杂度:O(N) N是vector中元素的个数v.insert(it,value) 时间复杂度:O(N)v.erase(it) 时间复杂度:O(N)v.erase(first,last) 即删除[first,last)内元素时间复杂度:O(N)setset可以理解成集合,⼀个内部⾃动有序且不含重复元素的容器头⽂件:#include <set>定义:set<typename>name;set只能通过迭代器访问s.insert(value) 时间复杂度:O(logN) N为set内元素个数s.find(value) 时间复杂度:O(logN) N为set内元素个数s.erase(it) 时间复杂度:O(1)s.erase(value) 时间复杂度:O(logN)s.erase(first,last) 时间复杂度:O(last−first)s.size() 时间复杂度:O(1)s.clear() 时间复杂度:O(N)set中元素是唯⼀的,如果需要处理不唯⼀的情况,则需要使⽤multiset。

另外,C++11标准中还增加了unordered_set,以散列代替set内部的红⿊树(⼀种⾃平衡⼆叉查找树),使其可以⽤来处理只去重但不排序的需求,速度⽐set要快得多。

实验报告_实验14 标准模板库 STL(1)

实验报告_实验14 标准模板库 STL(1)

实验报告_实验14 标准模板库STL(1)(学生学号_姓名)实验目的:1、理解标准模板库STL的基本概念:容器、迭代器和算法;2、熟悉顺序容器:vector、list和deque的基本用法;3、熟悉函数对象的概念、基本应用。

实验内容1、(基础题)请分析、运行下列程序代码,回答相关问题,体会vector用法:(1)代码1问题:1)创建vector对象常有哪些方法?答:用vector <类型> 对象名创建。

2)写出访问vcctor元素的4种不同方法;答:使用迭代器访问。

用数组的形式访问。

3)如何在vector尾部插入元素?答:使用迭代器名.push_back()函数。

2、(基础题)请根据题意,填写程序所缺代码,并运行、验证:答:(1):int i=0(2):i<_str.size()(3):i++(4):_str[i](5):vec1.begin()(6):vec1.end()(7):erase(vec1.begin(),vec1.end())(8):erase(vec2.end()-1)3、(基础题)请分析、运行下列程序代码,回答相关问题,体会list用法:问题:1)如何创建list对象?答:list<类型对象名;2)怎样访问list元素?答:使用迭代器访问3)如何将list排序?答:使用list对象.sort()函数。

4.#include<list>#include<iostream>using namespace std;void main(){int i,t;int temp[30];for(i=0;i<30;i++)temp[i]=1;list<int> go;go.clear();for(i=0;i<30;i++)go.push_back(i);list<int>::iterator g = go.begin();while(go.size()>15){for(i=1;i<9;++i){++g;if(g==go.end())g=go.begin();}t=*g;temp[t]=0;g=go.erase(g);if(g==go.end())g=go.begin();}cout<<"1:基督徒\n2:非基督徒\n";cout<<"当初的排列顺序为:\n";for(i=0;i<30;i++){static int c=0;++c;cout<<temp[i]<<" ";if(c%5==0)cout<<" ";}cout<<endl;}。

第13章 标准模板库(STL)

第13章  标准模板库(STL)

13.1.1 容器
• 如果没有STL的支持,在处理一些复杂问题时,要 自行设计存储模式,如数组管理,插入删除操作 等,这不但很繁琐,而且bug频出,是程序出问题 最多的地方。STL运用模板类库机制,为数据存储, 查找和其他操作提供了一整套方案,大大提高了 程序的正确性,不仅如此,类库对常用的很多操 作进行了优化处理,大大提高了程序的效率。 • 容器即是可容纳一些数据的模板类,STL中有 vector,list,deque,set,map,multimap和 multiset等容器。
13.3.1 set容器
• 要使用set,必须使用头文件包含命令“#include <set>”,和前 面介绍的序列式容器vector、deque和list相似,set也使用模板 参数来提供要存储的值的类型: • set< 存储类型 [ , 排序函数或对象 ] > 容器对象名; • 第一个模板类型参数用以指定存储类型,而可选的第2个模板类型 参数用来指定对关键字进行排序的函数或函数对象,关于函数对 象在本章稍后章节会有介绍。在默认情况下,将使用less<>模板, 字面意义上可理解为按从小到大进行排列。 • 根据set的特点,STL提供了3中创建set的方式: • 创建空set容器对象,如: • set<int> obS; • 将迭代器的区间作为参数的构造函数,如: • int sz[9]={1,2,3,4,5,6,3,5,6}; • set<int> A(sz,sz+9); • 根据已有同类型的容器创建新容器,如 • set<int> B(A);
13.4.2 元素的删除
• • • • • 关联式容器支持以下4种删除元素的方式: (1)ob.erase(keyword) (2)void ob.erase(p) (3)void ob.erase(q1,q2) (4)void clear(void)
  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、函数适配器:函数适配器是允许合并函数对象以产生一个更复杂的函数对象的函数模板.版权声明:本文为博主原创文章,未经博主允许不得转载.。

相关文档
最新文档