C++ 标准模板库(STL)学习总结

合集下载

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 总结

STL(Standard Template Library)是C++标准庫的一部分(80%),是用C++ Template机制来表达泛型的庫。

STL,成功的将算法与数据结构分离,在没有效率损失的前提下,得到了及大的弹性。

六大组件容器(Container)算法(Algorithm)迭代器(Iterator)仿函数(Function object)适配器(Adaptor)空间配制器(allocator)Set,Map都不能用push_back,push_front,因为它是自动排序的。

Sets/Multisets内部的元素依据其值自动排序Set内的相同数值的元素只能出现一次,Multisets内可包含多个数值相同的元素。

内部由二叉树实现,便于查找。

Maps/MultimapsMap的元素是成对的键值/实值,内部的元素依据其值自动排序。

Map内的相同数值的元素只能出现一次,Multimaps内可包含多个数值相同的元素。

内部由二叉树实现,便于查找。

所有容器的共同操作一。

所有容器都提供了一个默认的构造函数,一个拷贝构造函数。

例:list<int> l;....vector<int> ivector(l.begin(),l.end());int array[]={1,2,3,4};....set<int> iset(array,array+sizeof(array)/sizeof(array[0]));二。

与大小相关的函数size(),empty(),max_size()三。

返回迭代器的函数begin(),end(),rbegin(),rend()四。

比较操作==,!=,<,>,>=....Vector详解:capacity(),返回vector能够容纳的元素个数。

size(),返回vector内现有元素的个数。

赋值操作:c1=c2; 把c2的全部元素指派给c1c.assign(n,elem);复制n个elem,指派给cc.assign(beg,end);将区间beg,end内的元素指派给cc1.swap(c2);将c1,c2元素互换swap(c1,c2);同上元素存取c.at(index);c[index];c.front();返回第一个元素c.back();插入和删除:c.insert(pos.elem);c.insert(pos,n.elem); 插入n个elemc.insert(pos,beg,end); 在pos出插入beg,end区间内的所有元素。

STL的熟悉与使用

STL的熟悉与使用

STL的熟悉与使用STL(Standard Template Library)是C++标准库中提供的一个功能强大的通用模板库,它包含了许多常用的数据结构和算法。

STL的熟悉与使用对于C++程序员来说非常重要,可以极大地提高开发效率和代码的质量。

本文将介绍STL的基本概念、常用数据结构和算法,以及如何进行STL的使用。

STL的基本概念:1. 容器(Containers):STL中的容器是用来存储数据的类模板,包括序列容器(vector、deque、list)和关联容器(set、map、multiset、multimap)。

容器可以分为序列容器和关联容器,其中序列容器是线性存储的,关联容器是使用键值对存储的。

2. 迭代器(Iterators):STL中的迭代器类似于指针,用来遍历容器中的元素。

迭代器提供了一种统一的访问容器元素的方式,可以通过自增和自减操作实现对容器元素的顺序访问。

3. 算法(Algorithms):STL中提供了大量的算法,包括查找、排序、复制、填充等。

算法可以直接操作容器中的元素,它们是通过迭代器来实现的,所以使用算法需要利用容器的迭代器对容器中的元素进行操作。

4. 函数对象(Function Objects):STL中的函数对象是一种可以像函数一样被调用的对象。

STL中的很多算法需要传递函数对象来实现特定的功能,函数对象可以是函数指针、函数对象类或者是函数对象适配器。

STL常用数据结构和算法:1. vector:动态数组,支持随机访问和快速的尾部插入和删除,可以用来代替数组。

2. list:双向链表,支持快速的插入和删除操作,但不支持随机访问。

3. set:集合,其中的元素是有序且独一无二的,可以进行插入、删除和查找操作,内部通过红黑树实现。

4. map:映射,包含一系列的键值对,其中的键是有序且独一无二的,可以进行插入、删除和查找操作,内部通过红黑树实现。

5. sort:对容器中的元素进行排序,内部使用快速排序算法。

c++stl 源码剖析笔记

c++stl 源码剖析笔记

c++stl 源码剖析笔记
C++ STL(标准模板库)是C++标准库的一部分,它包含了许多常用的数据结构和算法,如向量、列表、映射、排序、搜索等。

STL 的源码剖析是一个相当复杂的话题,因为STL的实现涉及到大量的模板和元编程技术。

下面我将从几个方面对STL的源码进行剖析。

首先,STL的源码剖析可以从数据结构入手。

比如,我们可以深入研究STL中向量(vector)和映射(map)等数据结构的实现原理,了解它们是如何利用模板和迭代器来实现通用性和高效性的。

其次,STL的源码剖析也涉及到算法的实现。

STL中包含了大量的算法,如排序、查找、拷贝等,这些算法的实现往往涉及到迭代器和函数对象的使用,可以通过分析这些算法的源码来深入理解STL的设计思想和实现细节。

另外,STL的源码剖析还需要关注STL的底层实现。

STL的底层实现往往依赖于各种数据结构和算法,比如红黑树、哈希表等。

通过分析STL底层实现的源码,可以更好地理解STL的性能特点和使用注意事项。

此外,STL的源码剖析还需要关注STL的扩展性和可移植性。

STL的实现通常会考虑到各种平台和编译器的兼容性,因此可以通过分析STL的源码来了解其如何实现可移植性和扩展性。

总的来说,STL的源码剖析是一个庞大而复杂的工程,需要对C++模板、元编程、数据结构、算法等方面有深入的理解。

通过深入剖析STL的源码,可以更好地理解STL的设计思想和实现细节,从而更好地应用STL来解决实际问题。

STL模板库范文

STL模板库范文

STL模板库范文STL(Standard Template Library)模板库是C++语言中的一个重要组成部分,是一种通用的模板编程库。

STL模板库中包含了多种有用的数据结构和算法,以及用于操作这些数据结构和算法的迭代器等功能。

STL模板库的设计灵感来自于Ada语言中的容器库。

STL模板库的核心概念是数据结构和算法的分离,它将各种数据结构和算法封装成独立的模板。

数据结构模板提供了一种通用的数据存储方式,可以用于存储各种类型的数据,如整数、浮点数、字符串等。

算法模板提供了一系列通用的算法,可以用于操作这些数据结构,如查找、排序、合并等。

STL模板库中的数据结构包括向量(vector),链表(list),堆栈(stack),队列(queue),集合(set),映射(map)等。

这些数据结构都是通过模板实现的,可以根据需要自定义具体类型的数据结构。

例如,可以定义一个整数向量、一个字符串链表等。

STL模板库中的算法包括排序、查找、合并、遍历等。

其中,排序算法包括插入排序、选择排序、冒泡排序、快速排序、归并排序等。

查找算法包括线性查找、二分查找、哈希查找等。

合并算法包括合并排序、合并链表等。

遍历算法包括前序遍历、中序遍历、后序遍历、层次遍历等。

STL模板库还提供了迭代器(iterator)的功能,迭代器可以用于遍历数据结构中的元素。

迭代器提供了几种不同的访问方式,如前向迭代器、双向迭代器、随机访问迭代器等。

迭代器可以通过重载运算符来实现对数据结构中元素的访问和操作。

STL模板库的设计目标是为C++程序员提供一种高效且可复用的编程方式。

通过使用STL模板库,程序员可以更加方便地完成各种数据结构和算法的操作,避免了手动编写一些繁琐的代码。

此外,STL模板库还具有良好的可移植性,可以在不同平台上使用。

使用STL模板库的步骤包括引入头文件、定义数据结构和算法的模板对象、使用迭代器进行数据操作等。

以排序算法为例,可以通过引入<algorithm>头文件来使用STL模板库中的排序算法,然后定义一个向量对象,将需要排序的数据存储其中,最后使用迭代器对向量中的元素进行排序操作。

stl标准模板库

stl标准模板库

stl标准模板库STL标准模板库。

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

STL的设计理念是基于泛型编程,通过模板来实现数据结构和算法,使得代码具有高度的通用性和可重用性。

STL包含了多种容器类、迭代器、算法和函数对象等组件,为C++程序的开发提供了丰富的工具和资源。

容器类是STL中最基本的组件之一,它提供了各种不同类型的数据结构,如vector、list、deque、set、map等。

这些容器类可以方便地存储和管理数据,使得程序员能够更加专注于算法的实现,而不必关心数据的存储和管理细节。

通过使用STL容器类,程序员可以快速地构建出复杂的数据结构,从而提高代码的可读性和可维护性。

除了容器类之外,STL还提供了丰富的算法和函数对象,用于对容器中的数据进行操作和处理。

这些算法包括了排序、查找、遍历、复制、删除等常见操作,可以大大简化程序员的工作。

此外,STL还引入了迭代器的概念,使得算法能够与容器类解耦,从而更加灵活地进行数据处理。

在STL中,迭代器是一种类似指针的对象,用于遍历容器中的元素。

STL提供了多种不同类型的迭代器,如输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器等。

这些迭代器可以适配不同类型的容器,使得算法能够在不同的数据结构上通用,从而提高了程序的灵活性和可扩展性。

STL的设计思想是将数据结构和算法进行有效地组织和封装,使得程序员能够更加高效地开发和维护代码。

通过STL,程序员可以避免重复造轮子的工作,而是直接使用标准库提供的通用组件,从而提高了代码的质量和效率。

此外,STL还为C++程序员提供了一种统一的编程风格和规范,使得代码更加易读和易懂。

总的来说,STL标准模板库是C++程序开发中不可或缺的重要组成部分,它为程序员提供了丰富的工具和资源,使得代码的开发和维护变得更加高效和简便。

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,提高自己的编程水平和工作效率。

C++STL总结(带实例)文档入门STL

C++STL总结(带实例)文档入门STL

C++STL总结(带实例)⽂档⼊门STLC++ STL总结主要通过实例来解释C++⼀些STL库的⽤法,也可以当作⼿册阅读。

本⽂的样例代码默认使⽤std名称空间。

会持续更新(有空就会加⼀些)主要内容包括:string,stack,queue,list,vector,map,deque,set,pair的⽤法,和algorithm中的常⽤函数。

1. stringstring 是C++⽤来⾼效处理字符串的类,封装了很多常⽤的字符串处理⽅法。

下列样例str开头的变量都是string类,cstr表⽰C风格字符串. #include<cstring> 使⽤是要引⼊该库1.1 string的构造1. string str; 构造空字符串2. string str = str_a/cstr; 通过直接赋值构造3. string str(str_a); 深拷贝⼀个字符串4. string str(cstr); ⽤c风格字符串给字符串初始化5. string str(cstr,num); ⽤c风格字符串的前num个字符给字符串初始化6. string str(str_a,index); ⽤字符串a从index位置开始(包括)的字符串来初始化7. string str(num,char); ⽤num个字符char拼接成⼀个字符串string str_a ="this is a string";//this is a stringstring str_b(str_a);// this is a stringchar cstr[20]="this is a string";//this is a stringstring str_c(cstr);//this is a stringstring str_d(cstr,3);//thistring str_e(str_a,3);//s is a stringstring str_f(10,'#');//##########1.2 string的长度1. size()/length():返回string对象的长度。

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

STL_的熟悉与使用

STL_的熟悉与使用

STL_的熟悉与使用STL(Standard Template Library)是C++标准库的一部分,是一套通用的模板类和函数的集合,提供了多种常用数据结构和算法的实现。

STL能够大大提高C++程序的开发效率,减少了大量重复的编程工作,同时具有高效性、可复用性和可扩展性。

熟悉和使用STL对于C++程序员来说是非常重要的,下面将介绍STL的常用组件和使用方法。

1. 容器(Containers):STL提供了多种容器,包括向量(vector)、链表(list)、双端队列(deque)、集合(set)、映射(map)等。

容器提供了存储和管理对象的能力,可以根据需要选择适合的容器来存储数据。

例如,vector容器类似于动态数组,可以方便地插入、删除元素,而map容器允许根据关键字快速查找对象。

2. 迭代器(Iterators):STL的迭代器提供了对容器内元素的访问和遍历,类似于指针的概念。

迭代器可以指向容器内的一些元素,并可以通过自增自减操作移动到容器的下一个或上一个元素。

STL提供了多种类型的迭代器,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器等,不同类型的迭代器具有不同的功能和特性。

3. 算法(Algorithms):STL提供了一系列常用的算法,包括排序(sort)、查找(find)、拷贝(copy)、替换(replace)等。

这些算法可以直接应用于容器上,无需开发者自己实现。

使用STL算法可以大大简化代码,提高开发效率,同时也能确保算法的正确性和高效性。

4. 函数对象(Function Objects):STL中的函数对象类似于函数指针,可以作为参数传递给算法,用于指定特定的操作。

STL提供了一些内置的函数对象,如加法、减法、小于、等于等,同时也可以自定义函数对象。

函数对象可以方便地与算法结合使用,实现更加灵活和复杂的操作。

5. 适配器(Adapters):STL的适配器用于将一种容器或迭代器转换为另一种容器或迭代器的形式。

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)介绍(上)作者: winter作者:Scott Field本文以List容器为例子,介绍了STL的基本内容,从容器到迭代器,再到普通函数,而且例子丰富,通俗易懂。

不失为STL的入门文章,新手不容错过!这篇文章是关于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也是算法和其他一些组件的集合。

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

C++标准库——STL

C++标准库——STL

C++标准库——STL阅读⽬录 想要彻底搞懂C++是很难的,或许是不太现实的。

但是不积硅步,⽆以⾄千⾥,所以抽时间来坚持学习⼀点,总结⼀点,多多锻炼⼏次,相信总有⼀天我们会变得"了解"C++。

1. C++标准库——STL1.1 STL简介 STL(Standard Template Library,标准模板库)是惠普实验室开发的⼀系列软件的统称。

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

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

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

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

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

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

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

C++STL总结

C++STL总结

C++STL总结STL概述STL (Standard Template Library, 标准模板库) 是惠普实验室开发的⼀系列软件的统称。

主要核⼼分为三⼤部分:容器(container)、算法(algorithm)和迭代器(iterator),另外还有容器适配器(container adaptor)和函数对象(functor)等其它标准组件。

容器:顺序容器:名称特性vector模拟的数据结构式动态数组,在内存中是连续储存的,⽀持随机存取,⽀持在尾部快速插⼊和删除元素,搜索速度较慢deque 称为双端队列,在内存中的储存⽅式是⼩⽚连续,每⽚之间⽤链表连接起来,⽀持随机存取,⽀持在头部和尾部快速插⼊和删除元素,搜索速度较慢list 称为双向链表,在内存中的储存是不连续的,每个元素的内存之间⽤指针相连,不⽀持随机存取(因为要从⾸或尾遍历⾄指定位置),但是⽀持在任意位置快速插⼊和删除元素,搜索速度最慢,扩展内存时⽆需复制和拷贝原元素array称为静态数组,在内存中是连续储存的,⽀持随机存取,不⽀持插⼊或删除元素forward_list 称为前向链表,在内存中的储存是不连续的,同list⼀样⽀持在任意位置快速插⼊和删除元素,不⽀持随机存取,搜索速度也较慢,与list最⼤的区别在于其只能从头部遍历⾄尾部,不能反向遍历,因此没有保存后向指针,⽐list更省内存,插⼊和删除元素⽐list稍慢。

注:红⾊加粗的容器为C++11标准中新增的关联式容器:名称特性set 以红⿊树实现,内存中是不连续储存的,保存的是元素是唯⼀的键值且不可变,排列的⽅式根据指定的严格弱序排列,不⽀持随机存取,搜索速度较快multiset与set基本⼀致,差别就在于允许保存重复键值map 同样以红⿊树实现,保存的元素是⼀个pair类型{key, value},每个键值对应⼀个值,且键值唯⼀不可变,键值的排列⽅式根据指定的严格弱序排列,⽀持⽤key进⾏随机存取,搜索速度较快multimap与map基本⼀致,差别在于键值可以重复名称特性unordered_set 以哈希表实现,内存中是不连续储存的,保存的是元素是唯⼀的键值且不可变,⽆序的排列⽅式,不⽀持随机存取,搜索速度⽐红⿊树实现的set要快unordered_multiset与unordered_set基本⼀致,差别就在于允许保存重复键值unordered_map 同样以哈希表实现,保存的元素是⼀个pair类型{key, value},每个键值对应⼀个值,且键值唯⼀不可变,key值⽆序排列,⽀持⽤key进⾏随机存取,搜索速度⽐红⿊树实现的map要快unordered_multimap与unordered_map基本⼀致,差别在于键值可以重复容器适配器:均可以⽤vector, list和deque来实现,没有提供迭代器名称特性stack默认⽤deque来实现数据结构的栈的功能queue默认⽤deque来实现数据结构的队列的功能priority_queue默认⽤vector来实现,其中保存的元素按照某种严格弱序进⾏排列,队⾸元素总是值最⼤的空间适配器allocator:C++ Primer 5th中⽂版P427allocator模板类定义在头⽂件memory.h中,它帮助我们将内存分配和对象构造分开来。

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

C++标准模板库(STL)顺序性容器1.C++ Vector(向量容器)vector提供如下函数或操作:clear() 移除容器中所有数据empty() 判断容器是否为空erase(pos) 删除pos位置的数据erase(beg,end) 删除[beg,end)区间的数据front() 传回第一个数据back()返回vector中末尾元素的引用data()返回指向vector内存的指针insert(pos,elem) 在pos位置插入一个elem拷贝pop_back() 删除最后一个数据push_back(elem) 在尾部加入一个数据resize(num) 重新设置该容器的大小size() 返回容器中实际数据的个数max_size()函数返回vector能够容纳的最大元素个数begin() 返回指向容器第一个元素的迭代器end() 返回指向容器最后一个元素的迭代器capacity()返回vector中实际分配的内存大小reverse()改变vector的容量大小,当vector的容量设定时,vector的容量不会因此动态分配operator[ ]()获取vector中元素,这个和C中获取数组元素一样at()获取vector中的元素,这个和[]的作用一样,不过和[]不同的是,at()函数要对数组的边界进行检查,如果越界就会抛出异常,但是[]不会。

2.C++ List(链表)Lists将元素按顺序储存在链表中. 与向量(vectors)相比, 它允许快速的插入和删除,但是随机访问却比较慢.assign() 给list赋值back() 返回最后一个元素begin() 返回指向第一个元素的迭代器clear() 删除所有元素empty() 如果list是空的则返回trueend() 返回末尾的迭代器erase() 删除一个元素front() 返回第一个元素get_allocator() 返回list的配置器insert() 插入一个元素到list中max_size() 返回list能容纳的最大元素数量merge() 合并两个listpop_back() 删除最后一个元素pop_front() 删除第一个元素push_back() 在list的末尾添加一个元素push_front() 在list的头部添加一个元素rbegin() 返回指向第一个元素的逆向迭代器remove() 从list删除元素remove_if() 按指定条件删除元素rend() 指向list末尾的逆向迭代器resize() 改变list的大小reverse() 把list的元素倒转size() 返回list中的元素个数sort() 给list排序splice() 合并两个listswap() 交换两个listunique() 删除list中重复的元素3.C++ deque(双向队列)容器deque和vector非常相似,操作函数基本一致。

它采用动态数组来管理元素,提供随机存取,可以在头尾两端进行快速安插和删除元素操作。

特别要注意,除了头尾两端,在任何地方安插与删除元素,都将导致指向deque元素的任何pointers references iterators 失效。

包括的头文件为:#include <deque>using namespace std;声明一个deque时,一般需要前缀std:: ,如std::deque<int> c;因为类型deque是一个定义在namespace std内的template 。

构造函数:deque<Elem> c ; //产生一个空的deque,其中没有任何元素deque<Elem> c1(c2); //产生另一个同型deque的副本(所有元素都被拷贝)deque<Elem> c(n) ; //产生一个大小为n的dequedeque<Elem> c(n , elem) ; //产生一个大小为n的deque,//每个元素值都是elem。

dequer<Elem> c(begin,end); //产生一个deque,以区间[begin ; end]//做为元素初值析构函数:c.~ deque<Elem>() ;销毁所有元素,并释放内存。

非变动性操作c.size(); //返回当前的元素数量c.empty(); //判断大小是否为零。

等同于c.size() == 0,但可能更快c.max_size(); //可容纳元素的最大数量c.at(idx) ; //返回索引为idx所标示的元素。

如果idx越界,抛出out_of_rangec[idx] ; //返回索引idx所标示的元素。

不进行范围检查c.front() ; //返回第一个元素,不检查元素是否存在c.back(); //返回最后一个元素c.begin(); //返回一个随机迭代器,指向第一个元素c.end(); //返回一个随机迭代器,指向最后元素的下一位置变动性操作:c.assign(n , elem); //将n个elem副本赋值给cc.assing(beg , end); //将区间[beg;end]中的元素赋值给c;c.push_back(elem); //在尾部添加元素elemc.pop_back() ; //移除最后一个元素(但不回传)c.push_front() ; //在头部添加元素elemc.pop_front() ; //移除头部一个元素(但不回传)c.erase(pos) ; //移除pos位置上的元素,返回一元素位置//如c.erase( c.begin() + 5) //移除第五个元素c.insert(pos , elem); //在pos位置插入一个元素elem,并返回新元素的位置c.insert(pos , n , elem); //在pos位置插入n个元素elem,无返回值c.insert(pos , beg , end);c.resize(num); //将容器大小改为num。

可更大或更小。

c.resize(num , elem); //将容器大小改为num,新增元素都为 elemc.clear(); //移除所有元素,将容器清空关联容器一、关联容器的类型map 关联数组:元素通过键来存储和读取采用键-值的存储方式,键是唯一的不能重复set 大小可变的集合,只存储键(唯一),支持通过键的快速读取,不能修改已有的键值multimap 支持同一个键出现多次的map 类型multiset 支持同一个键出现多次的set 类型顺序容器键值的要求,键所使用的类型必须定义了<操作符二、pair类型简介(头文件utility中定义)pair<T1,T2> p1;make_pair(v1,v2) 以v1,v2值创建一个新的pair对象,返回一个pair类型三、关联容器的操作关联容器的操作大多数和顺序容器共享,但也存在区别:关联容器不提供push_front,push_back,front,back,pop_front,pop_back操作不能通过容器大小来定义关联容器,不支持assign,resize操作四、map类型1、 map类定义的类型map<k,v>::key_type 键的类型map<k,v>::mapped_type 值的类型map<k,v>::value_type pair类型,<first,second> first元素的类型是:constmap<k,v>::key_typesecond元素的类型是:map<k,v>::mapped_type1.set(集合)set关联容器,值与键类型相同,值就是键,因为键是唯一的,所以里面的元素不会有重复的,插入元素后自动排序。

STL提供了一些通用函数,可以对set对象操作:1、set_union(),并集;2、set_intersection(),交集;3、set_difference(),两个集合的差;4、insert(),插入元素;set的两个成员函数:1、lower_bound(),迭代器,指向第一个不小于键参数的成员;2、upper_bound(),迭代器,指向第一个大于键参数的成员;set的基本操作:begin() 返回指向第一个元素的迭代器clear() 清除所有元素count() 返回某个值元素的个数empty() 如果集合为空,返回trueend() 返回指向最后一个元素的迭代器equal_range() 返回集合中与给定值相等的上下限的两个迭代器erase() 删除集合中的元素find() 返回一个指向被查找到元素的迭代器get_allocator() 返回集合的分配器insert() 在集合中插入元素lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器key_comp() 返回一个用于元素间值比较的函数max_size() 返回集合能容纳的元素的最大限值rbegin() 返回指向集合中最后一个元素的反向迭代器rend() 返回指向集合中第一个元素的反向迭代器size() 集合中元素的数目swap() 交换两个集合变量upper_bound() 返回大于某个值元素的迭代器value_comp() 返回一个用于比较元素间的值的函数2. C++ multiSets(多元集合)多元集合(multiSets)和集合(sets)相像,只不过支持重复对象。

(具体用法请参照set容器) begin()返回指向第一个元素的迭代器clear()清除所有元素count()返回指向某个值元素的个数empty()如果集合为空,返回trueend()返回指向最后一个元素的迭代器equal_range()返回集合中与给定值相等的上下限的两个迭代器erase()删除集合中的元素find()返回一个指向被查找到元素的迭代器get_allocator()返回多元集合的分配器insert()在集合中插入元素key_comp()返回一个用于元素间值比较的函数lower_bound()返回指向大于(或等于)某值的第一个元素的迭代器max_size() 返回集合能容纳的元素的最大限值rbegin()返回指向多元集合中最后一个元素的反向迭代器rend()返回指向多元集合中第一个元素的反向迭代器size()多元集合中元素的数目swap()交换两个多元集合变量upper_bound()返回一个大于某个值元素的迭代器value_comp()返回一个用于比较元素间的值的函数3.C++ mapsC++ Maps是一种关联式容器,包含“关键字/值”对begin() 返回指向map头部的迭代器clear()删除所有元素count() 返回指定元素出现的次数empty() 如果map为空则返回trueend() 返回指向map末尾的迭代器equal_range() 返回特殊条目的迭代器对erase() 删除一个元素find() 查找一个元素get_allocator() 返回map的配置器insert() 插入元素key_comp() 返回比较元素key的函数lower_bound() 返回键值>=给定元素的第一个位置max_size() 返回可以容纳的最大元素个数rbegin() 返回一个指向map尾部的逆向迭代器rend() 返回一个指向map头部的逆向迭代器size() 返回map中元素的个数swap() 交换两个mapupper_bound() 返回键值>给定元素的第一个位置value_comp() 返回比较元素value的函数4.C++ multimapsbegin()返回指向当前集合中第一个元素的迭代器。

相关文档
最新文档