初识STL和容器

STL概念


       STLC++标准库的最重要的组成部分,STL(标准模板库)不仅是一个可复用的组件库,而且是一个包罗算法和数据结构的软件框架。

 

STL的六大组件


1.容器-各种数据结构(vectorlistmapset等);

2.迭代器-扮演容器和算法的胶合剂;

3.空间配置器-负责内存空间的分配与管理;

4.配接器-一种修饰容器或者仿函数或者迭代器接口的东西;

5.算法-各种常见算法(sortsearchcopy等);

6.仿函数(行为类似函数的类,用作算法的某种策略)。

 

容器:

 

        STL是一个标准的c++库,容器是其中的一个重要组成部分。

        容器包括:顺序容器、关联容器。

        容器:容器是容纳特定类型对象的集合,因此容器里面的对象必须是同一类型,而且该类型必须是可拷贝构造和可赋值的,包括的类型有内置的基本数据类型和带有公用拷贝构造函数和赋值操作符的类。容器可视为是数组的扩展,即对象的数组(广义数组),其中的元素(对象)通过容器对“[]”的重载,可以和数组一样利用下标(索引)来访问。

注意:STL中的容器可以包含的类型有内置的基本数据类型和带有公用拷贝构造函数和赋值操作符的类。

(1)顺序容器

       顺序容器,指的是将一组具有相同类型T的对象,以严格的线性形式组织在一起,可以视为数组和链表的推广。包括以下3种:


vector<T>:是一种顺序容器,存放的元素是以连续的数组的方式存储的,可通过v[i]的方式访问vector中的元素,此时vector的访问时间是非常小的。而在对特定的值进行访问时,只能通过遍历vector的方式进行比较,这样的操作会导致较大的时间开销。同时在对vector的中间插入或删除元素时,由于需要保持元素的连续性,通常会导致vector把后面的元素复制一遍,因此,在随机插入方面vector相对来说性能较低。

       vector添加数据的默认方法是push_back(),push_back()函数表示将数据添加到vector的尾部,并按需要分配内存,如在vector<Widget>中添加10个数据,需要编写如下代码:

for (int i = 0; i < 10; i++)

{

      v.push_back(Widget(i));//在vector中添加数据

}

         empty()函数可以判断vector是否存放两种数据;size()可以获取vector的大小;

         vector提供了erase(),pop_back(),clear()来删除数据。


deque<T>:是一个双端队列,存放的数据不是以连续的形式存放的,其操作接口和vector类似。


list<T>:一种链表的实现,储存的元素是通过使用双向链表实现的。优势在于在list的任意位置进行插入和删除时,非常的快速。但是对于list中的内容只能通过连续的方式对元素进行存取,如需要对list中的第1000个元素进行访问,并修改其中的数据,只能从list的开头开始一个一个地移动,直到到达第1000个元素为止,因此list在查找和随机存取时需要耗费更大的开销。


(2)关联容器

       关联容器是能够通过键值(关键字)来查找和读取元素的容器,提供一个key(键)实现对元素的随机访问,其特点是key是有序的,即元素是按预定义的键顺序(例如升序)插入的。关联容器具有从基于键的集合中快速提取对象的能力,其中集合的大小在运行时是可变的。包括以下4种:


set<Key>(集合):支持唯一键值,并提供对键本身的快速检索;例如:set<long>:{学号}set类的头文件<set>;

 

multiset<Key>(多重集合):支持可重复键值,并提供对键本身的快速检索;例如set<string>:{姓名}(可能有同名的)(multiset类的头文件是<set>;

 

map<Key,T>:支持唯一Key类型的键值,并提供对另一个基于键的类型T的快速检索;例如map<long,string>:{(学号,姓名)}{(电话号码,姓名)}等(map类的头文件是<map>;

 

multimap<Key,T>(多重映射):支持可重复Key类型的键值,并提供对另一个基于键的类型T的快速检索;例如map<string,string>:{(姓名,地址)}{(姓名,年龄)}等(multimap类的头文件是<map>)。


      map的元素是“键-值”对的二元组形式,即键用作元素在map中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。如果需要一个键对应多个实例,则需要使用multimapmultiset类型,这两种类型允许多个元素拥有相同的键。set所包含的元素的值是唯一的,集合中的元素按一定顺序排列,并作为集合中的实例,一个集合通过一个链表来组织,在插入操作和删除操作上比vector快,但查找或添加末尾的元素时会有些慢。

 

另外,在STL中有3种容器适配器(空间配置器):


stack<T>():只支持top()(读取栈顶元素)、push()(在栈顶处加入新元素)和pop()(取出栈顶元素)操作(后进先出)的一种序列容器。(stack类的头文件是<stack>;

 

queue<T>(队列):stack类似,queue也是对序列容器的限制实现。与栈相比,队列也支持back()(读取队尾处的元素)和push_back()(在队尾处插入新元素)操作,但是不再支持pop_back()(取出队尾处的元素)操作。不过,队列允许front()(读取队首处的元素)pop_front()(取出队首处的元素)操作(前出后入)。(queue类的头文件是<queue>;

 

priority_queue<T>(优先队列):也是一种队列queue,不过其中的每个元素都被给定了一个优先级,用来控制元素到达队首top()的顺序。 默认情况下,优先队列简单地使用运算符<进行元素比较,top()返回最大的元素。

 

 

迭代器


      迭代器就如同一个指针,事实上,C++中的指针也是一种迭代器。迭代器类似与指针一样,能够使用*操作符类获取数据,还可使用自增操作符和+-运算符对迭代器进行操作,用以访问容器中的对象。迭代器有两个位置可以通过容器的begin()操作和end()操作获取,其中begin指向容器中的第一个元素,end指向容器中的最后一个元素的下一个位置,也就是说end所指向的并不是容器的元素,通常beginend之间的范围就是迭代器的范围。

 

注意:在使用迭代器之前,不应该存储操作end()的返回值。因为如果在保存end()的返回之后,使用旧的end()值很可能所指向的元素已经不存在或者是死循环,再对容器的元素进行插入和删除,将会导致end()迭代器失效。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值