stl各种容器的区别
STL容器的效率比较

STL容器的效率比较介绍stringvectorlistdequevector Vs list Vs deque1.介绍顺序存储容器: string、vector、list、deque关联存储容器:map底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错, 只是每次插入值的时候,会重新构成底层的平衡二叉树,效率有一定影响.set 和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问set:集合, 用来判断某一个元素是不是在一个组里面,使用的比较少map:映射,相当于字典,把一个值映射成另一个值,如果想创建字典的话使用它好了2.stringstring 是basic_string<char> 的实现,在内存中是连续存放的.为了提高效率,都会有保留内存,如string s= "abcd",这时s使用的空间可能就是255, 当string再次往s里面添加内容时不会再次分配内存.直到内容>255时才会再次申请内存,因此提高了它的性能.当内容>255时,string 会先分配一个新内存,然后再把内容复制过去,再复制先前的内容.(Copy-On-Write技术)对string的操作,如果是添加到最后时,一般不需要分配内存,所以性能最快;如果是对中间或是开始部分操作,如往那里添加元素或是删除元素,或是代替元素,这时需要进行内存复制,性能会降低.如果删除元素,string一般不会释放它已经分配的内存,为了是下次使用时可以更高效.由于string会有预保留内存,所以如果大量使用的话,会有内存浪费,这点需要考虑.还有就是删除元素时不释放过多的内存,这也要考虑. string中内存是在堆中分配的,所以串的长度可以很大,而char[]是在栈中分配的,长度受到可使用的最大栈长度限制. 如果对知道要使用的字符串的最大长度,那么可以使用普通的char[],实现而不必使用string. string用在串长度不可知的情况或是变化很大的情况.如果string已经经历了多次添加删除,现在的尺寸比最大的尺寸要小很多,想减少string使用的大小,可以使用:string s = "abcdefg";string y(s); // 因为再次分配内存时,y只会分配与s中内容大一点的内存,所以浪费不会很大s.swap(y); // 减少s使用的内存如果内存够多的话就不用考虑这个了。
STL有6种序列容器类型

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;联合容器将值与关键字关联在一起,使用关键字来查找值。
关联容器的长处在于,它提供了对元素的快速访问。
stl各种容器区别

C++ 标准模板库在STL中基本容器有:string、vector、list、deque、set、mapSet和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问Set:集合,用来判断某一个元素是不是在一个组里面,一般此容器使用的比较少。
Map:映射,相当于字典,把一个值映射成另一个值,如果想创建字典的话使用它是最好的,底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错,只是每次插入值的时候,会重新构成底层的平衡二叉树,效率有一定影响。
string、vector、list、deque、set是有序容器;1. string名为:通用字符串库string是一个处理字符串数据的类,支持变长字符串,支持随机存取string是basic_string<char>实现,在内存中是连续存放的,为了提高效率,都会有保留内存,会在一开始分配一个大小于内容的内存,当内容增加时不用再分配新的内存,只有当已分内存放不下时。
再分配新的内存空间。
对string的操作,如果是添加到最后时,一般不需要分配新的内存,所以性能最快;如果对中间或是开始部分操作,如往那里添加元素或是删除元素,或是代替元素,这时需要进行内存复制,性能会降低。
当删除元素时,并不会立刻释放它已经分配的内存,为了是下次使用时可以高效。
由于保留内存,所以大量使用时会有内存浪费。
在堆中分配内存;2. vector名为:通用向量(数组)库Std:vector, 是一个变长一维数组模板类,同内建数组一样,支持随机存取。
、实际上就是一个动态数组,随机存取任何元素都能在常数时间完成,在尾端增删元素具有较佳的性能。
元素连续存放,同样有保留内存,如果减少大小后内存不会释放,当新值大于当前内存大小时才会再分配内存;其拥有一段连续内存,并且起始地址始终不变,因此能非常好的支持随即存取,即数组的[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时需要重新申请一块足够大的内存进行内存拷贝,大大影响了效率。
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?STL(Standard Template Library)是C++标准库的一部分,提供了一系列的数据结构和算法,以便开发者更加方便地进行软件开发。
STL 的设计目标是提供通用的、高效的、易用的模板类和函数,以支持各类常见的编程任务。
2. STL的基本组成部分STL主要由以下三个组件构成:a) 容器(Containers):用于存储各种类型的数据,如vector、list、deque、set、map等。
b) 算法(Algorithms):提供了一系列的算法,比如排序、查找、合并等操作,可以用于容器中的数据。
c) 迭代器(Iterators):充当容器和算法之间的桥梁,用于遍历容器中的元素。
3. STL常用容器及其特点STL提供了多种容器,每种容器都有各自的特点和适用场景。
以下是一些常用容器及其特点:a) vector:动态数组,支持快速随机访问,但在插入和删除元素时效率较低。
b) list:双向链表,支持快速插入和删除元素,但随机访问效率较低。
c) deque:双端队列,支持在两端进行快速插入和删除操作。
d) set:有序集合,内部元素自动排序,不允许重复元素。
e) map:有序键值对集合,内部元素按键排序,并且每个键只能对应一个值。
4. STL常用算法及其应用STL提供了丰富的算法,可以在各种容器上进行操作,以下是一些常用算法及其应用场景:a) find:在容器中查找指定元素,用于快速查找数据。
b) sort:对容器中的元素进行排序,用于按照一定规则重新排列数据。
c) merge:将两个有序容器合并为一个有序容器,用于合并多个有序数据集。
d) unique:移除容器中的重复元素,用于去重操作。
e) count:统计容器中指定元素出现的次数,用于计数操作。
5. STL迭代器的使用STL迭代器是一种模板类,用于遍历容器中的元素。
迭代器提供了类似指针的操作接口,可以通过解引用操作符来访问元素,使用自增运算符进行遍历。
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中的主要容器种类,每种容器都有各自的特性和适用场景,在实际开发中需要根据具体的需求选择合适的容器进行使用。
STL的基本概念和常用容器

STL基本概念STL的基本概念和常用容器张阜东 2007.10什么是STL STL历史 STL版本 六大组件2什么是STLSTL(Standard Template Library),即标准模 板库,是一个高效的C++程序库。
被容纳于C++标准程序库(C++ Standard Library) 中,是ANSI/ISO C++标准中最新的也是极具革命性的 一部分。
包含了诸多在计算机科学领域里常用的基本数据结构 和基本算法。
为广大C++程序员们提供了一个可扩展的 应用框架,高度体现了软件的可复用性。
STL历史1971 : David R. Musser 开始倡导 Generic Programming 概念。
1979 : Alexander Stepanov 创造 STL 1987 : Alex 和 Musser 开发出一套 Ada library ???? : Alex 先后在 AT&T 及 HP实验室以 C 及 C++实验大量的体系结构和算法形式。
1992 : Meng Lee 加入称为另一位主要贡献者 1993/11 : Alex 于 ANSI/ISO C++ 会议展示 1994 夏 : STL 被纳入 C++标准43STL的不同实现版本STL是一个标准,各商家根据这个标准开 发了各自的STL版:HP STL:全世界所有的STL 实品,都源于 Alexander Stepanov 和 Meng Lee 完成的原始版 本 ,现在已经很少用了 SGI STL :STL之父Alexander Stepanov离开HP之 后就去了SGI,SGI STL设计者和编写者包括 Alexander Stepanov和Matt Austern。
它属于开放源 码,被GCC所采用。
由于GCC对C++语言标准的支 持很好,SGI STL在linux平台上的性能相当出色。
此 外,其源代码的可读性也很好。
STL版本cont.STLport:旨在将SGI STL的基本代码移植到各种主流编译环 境中,使各种编译器的用户都能够享受到SGI STL的先进之 处。
stl标准库

stl标准库STL(Standard Template Library)标准库是C++语言中非常重要的一部分,它提供了许多常用的数据结构和算法,为C++程序员提供了强大的工具,使得编程变得更加高效和简洁。
在本文中,我们将深入探讨STL标准库的各个方面,包括其组成部分、常用的数据结构和算法,以及如何在实际项目中应用STL标准库。
STL标准库由多个组件组成,其中最重要的三个组件分别是容器(Containers)、算法(Algorithms)和迭代器(Iterators)。
容器是用来存储数据的数据结构,常见的容器包括向量(vector)、链表(list)、集合(set)和映射(map)等。
算法是对容器中的数据进行操作的函数集合,包括查找、排序、删除和修改等功能。
迭代器是用来遍历容器中的数据的工具,它提供了统一的访问容器元素的接口,使得算法可以和容器进行无缝的配合。
在实际项目中,STL标准库可以极大地提高程序员的工作效率。
以向量(vector)为例,当我们需要一个动态数组来存储一系列数据时,使用STL中的向量可以避免手动管理内存和处理数组扩容的问题,大大简化了代码的编写。
另外,STL中提供的丰富的算法库可以帮助我们快速实现各种常见的数据操作,比如查找最大值、计算平均值、排序等,而不需要重复造轮子。
除了提供基本的数据结构和算法外,STL标准库还提供了一些高级的组件,比如函数对象(Functors)、适配器(Adapters)和迭代器适配器(Iterator Adapters)。
函数对象是可调用对象,它可以像函数一样被调用,常用于自定义排序和查找等算法中。
适配器是用来将一种容器或算法转换成另一种容器或算法的工具,它可以帮助我们复用现有的代码,提高代码的可维护性。
迭代器适配器则是用来扩展迭代器的功能,比如反向迭代器(reverse iterator)可以让我们从容器的末尾向前遍历数据。
总的来说,STL标准库是C++程序员必备的利器,它提供了丰富的数据结构和算法,可以极大地提高程序员的工作效率,减少重复劳动。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
C++ 标准模板库
在STL中基本容器有:string、vector、list、deque、set、map
Set和map都是无序的保存元素,只能通过它提供的接口对里面的元素进行访问Set:集合,用来判断某一个元素是不是在一个组里面,一般此容器使用的比较少。
Map:映射,相当于字典,把一个值映射成另一个值,如果想创建字典的话使用它是最好的,底层采用的是树型结构,多数使用平衡二叉树实现,查找某一值是常数时间,遍历起来效果也不错,只是每次插入值的时候,会重新构成底层的平衡二叉树,效率有一定影响。
string、vector、list、deque、set是有序容器;
1. string
名为:通用字符串库
string是一个处理字符串数据的类,支持变长字符串,支持随机存取
string是basic_string<char>实现,在内存中是连续存放的,为了提高效率,都会有保留内存,会在一开始分配一个大小于内容的内存,当内容增加时不用再分配新的内存,只有当已分内存放不下时。
再分配新的内存空间。
对string的操作,如果是添加到最后时,一般不需要分配新的内存,所以性能最快;
如果对中间或是开始部分操作,如往那里添加元素或是删除元素,或是代替元素,这时需要进行内存复制,性能会降低。
当删除元素时,并不会立刻释放它已经分配的内存,为了是下次使用时可以高效。
由于保留内存,所以大量使用时会有内存浪费。
在堆中分配内存;
2. vector
名为:通用向量(数组)库
Std:vector, 是一个变长一维数组模板类,同内建数组一样,支持随机存取。
、实际上就是一个动态数组,随机存取任何元素都能在常数时间完成,在尾端增删元素具有较佳的性能。
元素连续存放,同样有保留内存,如果减少大小后内存不会释放,当新值大于当前内存大小时才会再分配内存;
其拥有一段连续内存,并且起始地址始终不变,因此能非常好的支持随即存取,即数组的[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时需要重新申请一块足够大的内存进行内存拷贝,大大影响了效率。
同string一样,对最后元素的操作是最快的,此时一般不需要移动内存,只有保留内存不够时才需要分配内存进行内存拷贝。
对中间和开始处进行添加删除元素操作需要移动内存。
如果元素是结构和类,那移动的同时还会进行构造和析构操作,所以性能不高(此时以存储类对像的指针为好);
访问方面,由于是连续内存的存储。
所以对任何元素的访问都是O(1),即常数时间完成。
同string一样可以使用capacity看当前保留的内存,使用swap来减少它使用的内存。
同样在堆上分配内存;
随机访问效率很高
3. <list>
名为:通用链表库
list是一个通用的双向链表模板类,支持任意位置的数据读写,插入和删除操作。
对list的访问主要通过迭代器实现。
由于是链表存储所以内存空间上可以是不连续的,通过指针进行数据的访问,随机存储需要遍历指针所以效率很低。
但链表的特点,它可以很高的效率进行任意地方的删除和插入。
没有内存空间预留,所以每次增加元素都会从内存中分配空间,每次删除都会释放它占用的内存。
因为使用链表存储指针的方式,所以添加删除元素时不存在内存拷贝的问题,也没有对每类对像元素进行构造析构的问题,所以常作随机操作容器。
但就访问来说。
因为双向链表,只有开始和结尾元素的访问时间快。
其它元素都O(n)元素在堆上分配;
如果添加删除大内存元素用list比较好。
对于list<指针>是性能最低下的做法;
54 deque
Deque是一个双端队列,是一个个的堆。
每个堆保存几个元素,而堆之间使用指针连接,像是list和vector的结合,支持[]操作,也支持随机存取,可以有较高的随机访问速度。
在堆上分配内存;
5. <set>
名为:通用集合库
set或multiset是一个按用户指定排序规则将set内的数据进行排序的集合库,set内不允许有相同的数据,而multiset允许有重复数据。
6.<map>
名为:通用字典库
map或multimap是一个字典模板类,其索引可以是任意用户指定类型。
且能按用户指定排序规则将map内的数据进行排序的集合库,map内不允许有相同的数据,而multimap 允许有重复数据。