STL有6种序列容器类型
STL容器整理(office2003版)

第一类容器(支持迭代器)序列容器Vector(随机迭代访问)说明:vector是一种动态数组,是基本数组的类模板。
其内部定义了很多基本操作。
#include <vector> 注意:头文件没有“.h”构造:vector<int> v1; // 默认构造函数vector<int> v2(init_size,0); //如果预先定义了:int init_size;他的成员值都被初始化为0;vector<int> v3(v2); // 复制构造函数,构造一个新的向量,作为已存在的向量的完全复制;vector<int> v4(first, last) // 带两个常量参数的构造函数,产生初始值为一个区间的向量。
区间由一个半开区间[first, last) 来指定。
方法:assign(beg,end) 将(beg; end)区间中的数据赋值给对象。
assign(n,elem)将n个elem的拷贝赋值给对象。
at(idx)传回索引idx所指的数据,如果idx越界,抛出out_of_range。
back()传回最后一个数据,不检查这个数据是否存在。
begin()传回迭代器中的第一个数据地址。
capacity()返回容器中数据个数。
clear()移除容器中所有数据。
empty()判断容器是否为空。
end() // 指向迭代器中末端元素的下一个,指向一个不存在元素。
erase(pos) // 删除pos位置的数据,传回下一个数据的位置。
erase(beg,end)删除[beg,end)区间的数据,传回下一个数据的位置。
front()传回第一个数据。
get_allocator使用构造函数返回一个拷贝。
insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置insert(pos,n,elem) // 在pos位置插入n个elem数据,无返回值insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。
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:对容器中的元素进行排序,内部使用快速排序算法。
STL六大组件

STL六⼤组件容器(Container)算法(Algorithm)迭代器(Iterator)仿函数(Function object)适配器(Adaptor)空间配置器(allocator)1、容器作为STL的最主要组成部分--容器,分为向量(vector),双端队列(deque),表(list),队列(queue),堆栈(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)。
容器特性所在头⽂件<vector>向量vector可以⽤常数时间访问和修改任意元素,在序列尾部进⾏插⼊和删除时,具有常数时间复杂度,对任意项的插⼊和删除就有的时间复杂度与到末尾的距离成正⽐,尤其对向量头的添加和删除的代价是惊⼈的⾼的<deque>双端队列deque基本上与向量相同,唯⼀的不同是,其在序列头部插⼊和删除操作也具有常量时间复杂度<list>表list对任意元素的访问与对两端的距离成正⽐,但对某个位置上插⼊和删除⼀个项的花费为常数时间。
<queue>队列queue插⼊只可以在尾部进⾏,删除、检索和修改只允许从头部进⾏。
按照先进先出的原则。
<stack>堆栈stack堆栈是项的有限序列,并满⾜序列中被删除、检索和修改的项只能是最近插⼊序列的项。
即按照后进先出的原则<set>集合set由节点组成的红⿊树,每个节点都包含着⼀个元素,节点之间以某种作⽤于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序,具有快速查找的功能。
但是它是以牺牲插⼊删除操作的效率为代价的<set>多重集合multiset和集合基本相同,但可以⽀持重复元素具有快速查找能⼒<map>映射map由{键,值}对组成的集合,以某种作⽤于键对上的谓词排列。
具有快速查找能⼒<map>多重集合multimap⽐起映射,⼀个键可以对应多了值。
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>。
以下就简单介绍一下STL各个部分的主要特点。
二、算法大家都能取得的一个共识是函数库对数据类型的选择对其可重用性起着至关重要的作用。
举例来说,一个求方根的函数,在使用浮点数作为其参数类型的情况下的可重用性肯定比使用整型作为它的参数类性要高。
而C++通过模板的机制允许推迟对某些类型的选择,直到真正想使用模板或者说对模板进行特化的时候,STL就利用了这一点提供了相当多的有用算法。
它是在一个有效的框架中完成这些算法的——你可以将所有的类型划分为少数的几类,然后就可以在模版的参数中使用一种类型替换掉同一种类中的其他类型。
STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。
STL讲解

Map映射
映射,顾名思义就是一个数映射(指向)另一个数,或者几个数映射一个数。 比如:13 (1映射3); (1,2)3 ( (1,2)这对数映射到3上),但是不能多重映射,即 13,然后不能再有12这个关系了; 而multimap也是映射,但是允许多重映射,比如上面说的1可以映射到3,也可以同时映 射到2上。 如: map[键]=值。这种形式就是映射关系(看起来与一维数组很像,很多时候可以作为一 维数组使用,哈哈……) Map中的键值默认是从小到大排序的。 他们的成员函数都是一样的(和set与multiset的关系相似,可能有的函数返回值不一样) : begin() 返回指向map头部的迭代器 clear() 删除所有元素 count() 返回指定元素出现的次数 empty() 如果map为空则返回true end() 返回指向map末尾的迭代器 erase() 删除一个元素 find() 查找一个元素 insert() 插入元素 size() 返回map中元素的个数 swap() 交换两个map lower_bound() 返回键值>=给定元素的第一个位置 upper_bound() 返回键值>给定元素的第一个位置
vector
成员函数: 举例:vector<int> c ; c.back() 传回最后一个数据,不检查这个数据是否存在。 c.begin() 传回迭代器中的第一个数据地址。 c.clear() 移除容器中所有数据。 c.empty() 判断容器是否为空。 c.end() // 指向迭代器中末端元素的下一个,指向一个不存在元素。 c.erase(pos) // 删除pos位置的数据,传回下一个数据的位置。 c.erase(beg,end) 删除[beg,end)区间的数据,传回下一个数据的位置。 c.front() 传回第一个数据。 c.insert(pos,elem) // 在pos位置插入一个elem拷贝,传回新数据位置 c.insert(pos,n,elem) // 在pos位置插入n个elem数据,无返回值 c.insert(pos,beg,end) // 在pos位置插入在[beg,end)区间的数据。无返回值 c.max_size() 返回容器中最大数据的数量。 c.pop_back() 删除最后一个数据。 c.push_back(elem) 在尾部加入一个数据。 c.resize(num) 重新指定队列的长度。 c.reserve() 保留适当的容量。 c.size() 返回容器中实际数据的个数。
stl的基本组成

STL的基本组成1. 介绍STL(Standard Template Library)是C++语言的一个重要组成部分,它提供了一系列的模板类和函数,用于实现常用的数据结构和算法。
STL的设计目标是提供高效、可复用的组件,以提高程序开发的效率和质量。
STL的基本组成包括容器(Containers)、算法(Algorithms)和迭代器(Iterators)。
容器用于存储和管理数据,算法用于对数据进行处理和操作,而迭代器则用于访问容器中的元素。
这三个组件相互配合,形成了一个完整的库,为C++程序提供了丰富的功能。
在本文中,我们将详细介绍STL的基本组成,并探讨每个组件的特点和用法。
2. 容器容器是STL的核心组件之一,它用于存储和管理数据。
STL提供了多种容器类,包括序列容器(Sequence Containers)和关联容器(Associative Containers)。
2.1 序列容器序列容器是按照元素插入的顺序进行存储的容器。
STL提供了以下几种序列容器:•vector:动态数组,支持快速随机访问。
•list:双向链表,支持高效的插入和删除操作。
•deque:双端队列,支持快速的头部和尾部插入和删除操作。
•array:固定大小的数组,支持快速的随机访问。
序列容器的特点是可以通过下标或迭代器访问元素,支持动态增加和删除元素,并提供了一系列的成员函数和算法,用于对容器中的元素进行操作和处理。
2.2 关联容器关联容器是按照元素的键值进行存储的容器。
STL提供了以下几种关联容器:•set:集合,存储唯一的元素,按照键值自动排序。
•multiset:多重集合,存储不唯一的元素,按照键值自动排序。
•map:映射,存储键值对,按照键值自动排序。
•multimap:多重映射,存储不唯一的键值对,按照键值自动排序。
关联容器的特点是可以通过键值或迭代器访问元素,支持动态增加和删除元素,并提供了一系列的成员函数和算法,用于对容器中的元素进行操作和处理。
第一讲STL简介
第一讲STL 简介合肥工业大学计算机与信息学院2013-11程序设计艺术与方法学一个问题:输入任意个整数,排序然后输出。
23456第一章STL 简介1.1 引言1.2 STL 的组成结构1.3 STL 的应用71.1引言C++语言的核心优势之一就是便于软件的重用。
C++中有两个方面体现重用:面向对象的思想:继承和多态,标准类库。
泛型程序设计(generic programming) 的思想:模板机制,以及标准模板库STL 。
标准模板库(Standard Template Library)是ANSI/ISO C++语言的库的一个主要组成部分。
它包括了通用数据结构和基于这些结构的算法,向外提供统一标准的公共接口,使得使用STL方便、快捷地建立应用程序。
8泛型程序设计泛型程序设计,简单地说就是使用模板的程序设计法。
✧将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法。
有了STL ,不必再从头写大多的标准数据结构和算法,并且可获得非常高的性能。
9假如设计一个求两参数最大值的函数,在实践中我们可能需要定义四个函数:int max (int a, int b) { return (a>b) ? a :b; }long max (long a , long b ) { return ( a > b ) ? A : b ;}double max (double a , double b ) { return ( a >b)? A : b ; }char max (char a , charb ) { return ( a > b ) ? a : b ;}这些函数几乎相同,唯一的区别就是形参类型不同;需要事先知道有哪些类型会使用这些函数,对于未知类型这些函数不起作用。
stl使用手册
stl使用手册STL(标准模板库)是C++标准库的一个部分,提供了一套通用算法和数据结构的模板类。
下面是一个简单的STL使用手册,包括常用的容器、算法和迭代器的使用方法示例:1. 容器(Containers):- vector(向量):动态数组,可以通过索引访问元素。
- 声明和初始化:`vector<int> myVector;` 或 `vector<int> myVector = {1, 2, 3};`- 插入元素:`myVector.push_back(4);`- 访问元素:`int element = myVector[0];`- 遍历元素:`for (int element : myVector) { cout << element << " "; }`- list(链表):双向链表,可以在任意位置插入、删除元素。
- 声明和初始化:`list<int> myList;` 或 `list<int> myList = {1, 2, 3};`- 插入元素:`myList.push_back(4);` 或 `myList.push_front(0);` - 删除元素:`myList.pop_back();` 或 `myList.pop_front();`- 遍历元素:`for (int element : myList) { cout << element << " "; }`- map(映射表):键值对组成的有序集合,可以通过键访问值。
- 声明和初始化:`map<string, int> myMap;` 或 `map<string, int> myMap = {{"A", 1}, {"B", 2}};`- 插入元素:`myMap["C"] = 3;`- 访问元素:`int value = myMap["A"];`- 遍历元素:`for (pair<string, int> element : myMap) { cout << element.first << ":" << element.second << " "; }`- set(集合):不重复元素的有序集合。
stl容器知识点总结
stl容器知识点总结一、STL容器的种类STL中的容器主要分为序列式容器(Sequence Containers)和关联式容器(Associative Containers)两大类。
序列式容器包括vector、deque、list、forward_list以及array等,而关联式容器则包括set、map、multiset、multimap和unordered_set、unordered_map、unordered_multiset、unordered_multimap等。
1. 序列式容器(1)vector:动态数组,支持随机存取,可以在尾部进行快速插入和删除操作,但在中间和头部的插入和删除效率比较低。
(2)deque:双端队列,支持随机存取,同时在头部和尾部进行快速插入和删除操作,但在中间的插入和删除效率比较低。
(3)list:双向链表,支持在任意位置进行快速插入和删除操作,但不支持随机存取。
(4)forward_list:单向链表,与list相似,但只支持单向的迭代器访问。
(5)array:固定大小的数组,提供与普通数组相似的访问和操作方式。
2. 关联式容器(1)set:集合,不允许重复的元素,并且会自动排序。
(2)map:映射,每个元素都含有一个键值对,并且键是唯一的,自动排序。
(3)multiset:多重集合,允许重复的元素,并且会自动排序。
(4)multimap:多重映射,允许重复的键值对,并且会自动排序。
(5)unordered_set:无序集合,不允许重复的元素,内部实现采用哈希表。
(6)unordered_map:无序映射,每个元素都含有一个键值对,键是唯一的,内部实现采用哈希表。
(7)unordered_multiset:无序多重集合,允许重复的元素,内部实现采用哈希表。
(8)unordered_multimap:无序多重映射,允许重复的键值对,内部实现采用哈希表。
以上就是STL中的主要容器种类,每种容器都有各自的特性和适用场景,在实际开发中需要根据具体的需求选择合适的容器进行使用。
C++容器详解
C++容器详解什么是容器⾸先,我们必须理解⼀下什么是容器,在C++ 中容器被定义为:在数据存储上,有⼀种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器。
很简单,容器就是保存其它对象的对象,当然这是⼀个朴素的理解,这种“对象”还包含了⼀系列处理“其它对象”的⽅法,因为这些⽅法在程序的设计上会经常被⽤到,所以容器也体现了⼀个好处,就是“容器类是⼀种对特定代码重⽤问题的良好的解决⽅案”。
容器还有另⼀个特点是容器可以⾃⾏扩展。
在解决问题时我们常常不知道我们需要存储多少个对象,也就是说我们不知道应该创建多⼤的内存空间来保存我们的对象。
显然,数组在这⼀⽅⾯也⼒不从⼼。
容器的优势就在这⾥,它不需要你预先告诉它你要存储多少对象,只要你创建⼀个容器对象,并合理的调⽤它所提供的⽅法,所有的处理细节将由容器来⾃⾝完成。
它可以为你申请内存或释放内存,并且⽤最优的算法来执⾏您的命令。
容器是随着⾯向对象语⾔的诞⽣⽽提出的,容器类在⾯向对象语⾔中特别重要,甚⾄它被认为是早期⾯向对象语⾔的基础。
在现在⼏乎所有的⾯向对象的语⾔中也都伴随着⼀个容器集,在C++ 中,就是标准模板库(STL )。
和其它语⾔不⼀样,C++ 中处理容器是采⽤基于模板的⽅式。
标准C++ 库中的容器提供了多种数据结构,这些数据结构可以与标准算法⼀起很好的⼯作,这为我们的软件开发提供了良好的⽀持!通⽤容器的分类STL 对定义的通⽤容器分三类:顺序性容器、关联式容器和容器适配器。
顺序性容器是⼀种各元素之间有顺序关系的线性表,是⼀种线性结构的可序群集。
顺序性容器中的每个元素均有固定的位置,除⾮⽤删除或插⼊的操作改变这个位置。
这个位置和元素本⾝⽆关,⽽和操作的时间和地点有关,顺序性容器不会根据元素的特点排序⽽是直接保存了元素操作时的逻辑顺序。
⽐如我们⼀次性对⼀个顺序性容器追加三个元素,这三个元素在容器中的相对位置和追加时的逻辑次序是⼀致的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. STL有6种序列容器类型
(1)vector
它提供对元素的随即访问,在尾部添加和删除元素的时间是固定的,在头部或中部插
入和删除元素的复杂度为线性时间。
(2)deque
在<deque>文件中声明。
是双端队列,支持随即访问。
从deque的开始与末尾位置插入和删除元素的时间是固
定的。
尽管vector和deque都提供对元素的随机访问和在序列中部执行线性时间的插入和删
除操作,但vector容器执行这些操作时速度更快一些。
(3)list
是双向链表,插入删除元素时间固定。
不支持随机访问。
与vector不同是,当向容器中插入或删除元素后,链表迭代器指向元素将不变。
解释一下:如果一个vector有5个元素,中间插入一个,那么第五个元素包含的值将
是以前第四个元素的值,因此,迭代器指向的位置不变,但是数据不同。
然而,在链
表中插入新元素并不会移动已有的元素,而只是修改链接信息。
指向某个元素的迭代
器仍然指向该元素,也就是值相同,链接的位置不同了。
(4)queue
在<queue>头文件中声明。
queue是一个适配器类,底层类默认为deque。
它不允许随机访问队列元素,甚至不允许遍历队列。
可以将元素添加到队尾,查看队尾和队首的元素的值,检查元素数目和测试队列是否
为空。
(5)priority_queue
与queue的不同是,最大的元素总是在队首,也是一个适配器类,默认的底层类是vector 。
可以修改用于确定哪个元素放在队首的比较方式,方法是提供一个可选的构造函数参数。
(6)stack
也是一个适配器类,默认的底层实现为vector。
不允许随机访问堆栈元素,甚至不允许遍历堆栈。
可以压入到栈顶,从栈顶弹出元素,查看栈顶元素的值,检查元素数目和测试堆栈是
否为空。
2. STL有4种联合容器:set,multiset, map, multimap;
联合容器将值与关键字关联在一起,使用关键字来查找值。
关联容器的长处在于,它提供了对元素的快速访问。
与序列相似,联合容器也允许插入新元素,不过不能指定元素的插入位置。
原因是联合容器通常包含用于确定数据存放位置的算法,以便能够很快检索信息。
(1)set,multiset
前两种是在set头文件中(以前分别为set.h和multiset.h);
值的类型与关键字相同。
set删除相同的元素,multiset不会。
(2)map,multimap
后两种是在map头文件中(以前分别为map.h和multimap.h)。
值的类型与关键字不同。
map关键字唯一,multimap关键字不唯一。
1.输入迭代器
术语“输入”是从程序的角度说的,即来自容器的信息被视为输入,就像是来自键盘
的信息对程序来说是输入一样。
因此,输入迭代器可被程序用来读取容器中的信息。
具体的说,对输入迭代器接触引用将使程序能读读取容器中的值,但不一定能让程序修改值。
因此,需要输入迭代器的算法将不会修改容器中的值。
输入迭代器必须能够访问容器中所有的值,这是通过支持++操作符来实现的。
如果将输入迭代器设置为指向容器的第一个元素,并不断的将其递增,知道到达末尾位置,则它将一次指向容器中的每一个元素。
另外,并不能保证输入迭代器第二次遍历容器时,顺序不变。
输入迭代器并递增以后,也不能保证其先前的值仍然可以被解除引用。
(个人理解这句话:想想键盘输入,缓冲区内的值,读过以后就没有了,即使你保存了已经扫描过的迭代器,仍然不能重新对这个迭代器进行解除引用操作以得到他的值)。
基于输入迭代器的任何算法都应当是单通行的,不依赖于前一次遍历时的迭代器值,也不依赖于本次遍历中前面的迭代器值。
2.输出迭代器
输出是指用于将信息从程序传输给容器的迭代器,因此程序的输出就是容器的输入。
解除引用能让程序修改容器的值,但是不能读取。
发送到显示器上的输出就是如此,cout可以修改发送到显示器的字符流,却不能读取屏幕上的内容。
对于单通行,只读算法,可以使用输入迭代器;
对于单通行,只写算法,可以使用输出迭代器。
3.正向迭代器
正向迭代器只使用++操作符来遍历容器,所以它每次沿容器向前移动一个元素;
不过,与输入和输出迭代器不同的是,它总是按相同的循序遍历一些列值。
另外,将
正向迭代器递增后,仍然可以对前面的迭代器值解除引用,并可以得到相同的值。
这
些特征使得多次通行算法成为可能。
正向迭代器既可以似的能够读取和修改数据,也可以似的只能读取数据。
4.双向迭代器
它具有正向迭代器的所有特征,同时支持--操作符。
5.随机访问迭代器
随机访问迭代器具有双向迭代器的所有特性,同时添加了支持随机访问的操作和用于
对元素进行排序的关系操作符。
(就是可以比较指针的大小)
注意:各种迭代器的类型并不是确定的,而只是一种概念性的描述。
不能用面向对象
的语言来表达迭代器的种类,迭代器的种类只是一系列的要求,而不是一种类型(类
)。
在STL中,用概念一词来描述这一系列要求。
因此,有输入迭代器概念和双向迭
代器概念,但是却没有输入迭代器类型和双向迭代器类型。
STL有一个使用方便的预定义迭代器集合,其中包括正向迭代器、反向迭代器、插入
器和流迭代器还不是十分理解上面这段话的意思,恩,需要进一步了解预定义迭代器跟上面的5种迭代器的关系。