泛型程序设计
c++的核心优势是便于软件的重用:
1)面向对象的思想:继承和多态、标准类库
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。2)泛型程序设计 (generic programming):模板机制、标准模板库(standard template library, STL)(标准模板库就是一些常用的数据结构和算法模板的集合)
1.STL中的基本概念
容器:用于存放各种类型的数据(基本类型的变量,对象)的数据结构,是类模板
算法:用来操作容器中的元素,是函数模板
迭代器:用于依次存取容器中元素,类似于指针
2.容器
容器分三种
1)顺序容器(vector/deque/list)
vector 头文件<vector>
动态数组,在内存连续存放。随机存取能常数时间完成;尾部增删在大部分情况下是常数时间完成,这是由于动态数组申请内存都是预先申请较大内存,不够了再申请;但如果是插入或删除操作,就需要O(n)
deque 头文件<deque>
双向队列(有头尾指针),在内存连续存放。和vector的差别是两端增删在大部分情况下常数时间完成。
list 头文件<list>
双向链表,在内存不连续存放。在任何位置增删元素都需要修改前后元素的指针指向,即能常数时间完成,但存取一个元素,需要从头指针慢慢挪,即不支持随机存取。
2)关联容器(set/multiset/map/multimap)
所插入的元素需要通过相应排序规则来确定其位置。可用于查找,通常以平衡二叉树方式实现,插入和检索的时间都是O(log(N))。
3)容器适配器(stack/queue/priority_queue)
priority_queue 头文件<queue>
优先级队列,最高优先级元素总是第一个出列。
注:
1)对象被插入容器时,被插入的实际上是对象的复制品。此外,该对象所述的类还应对 == 和 < 进行重载
2)在使用容器时,需要注意某种操作的时间复杂度
3)成员函数
3.迭代器
用于指向顺序/关联容器中的元素,分const和非const,通过迭代器可以读取它指向的元素,通过非const迭代器可以修改它指向的元素。
1)定义:容器类名::iterator/const_iterator/reverse_iterator 变量名 (容器类即 从容器模板实例化出来的类)
访问迭代器指向的元素: *迭代器变量名
举例如下:
2)双向/随机访问迭代器
vector/deque支持随机访问迭代器,list/关联容器支持双向迭代器,容器适配器不支持迭代器
双向迭代器 p 可进行 p++/++p/p--/--p/*p/=/==/!=等操作
随机访问迭代器可进行双向迭代器的所有操作以及 +=/-=/+/-/[]/</>等操作
注:有些算法如sort/binary_search需要使用随机访问迭代器,那就不能使用list/关联容器
