组件 描述
容器(Container) —— 用来管理某一类对象的集合。c++提供了各种不同类型的容器
如:deque、list、vector、map等。
迭代器(Iterator) —— 用于遍历对象集合的元素。
算法(Algorithm) —— 处理集合内的元素。它们提供了执行各种操作的方式,
如:对容器的内容执行初始化、排序、搜索和转换等。
(1)顺序容器
将单一类型元素聚集起来成为容器,然后根据位置
来储存和访问这些元素。(vector)
vector: 后部插入\删除,直接接访问
deque: 前\后部插入\删除,直接访问
list: 双向链表,任意位置插入\删除
(2)关联容器
支持通过键来高效的查找和读取元素(map和set)
set: 快速查找,无重复元素
multiset: 快速查找,可有重复元素
map: 一对一映射,无重复元素,基于关键字查找
multimap:一对一映射,可有重复元素,基于关键字查找
(3)容器适配器(关联容器)
stack: LIFO(后进先出)
产生一个空容器
std::list
以另一个容器元素为初值完成初始化
std::list
......
std::vector
以数组元素为初值完成初始化
int arrray[]={2,4,6,13};
......
std::set
(4)赋值 和 交换
(5)与迭代器相关的操作
begin()-返回一个迭代器,指向第一个元素
end()-返回一个迭代器,指向最后一个元素之后
rbegin()-返回一个逆向迭代器,指向逆向遍历的第一个元素
rend()-返回一个逆向迭代器,指向逆向遍历的最后一个元素之后
(6)元素操作
insert(pos,e)-将元素e的拷贝安插于迭代器pos所指的位置
erase(beg,end)-移除[beg,end]区间内的所有元素
clear()-移除所有元素
二.迭代器:
可遍历STL容器内全部或部分元素的对象
指出容器中的一个特定位置
==和!= —— 判断两个迭代器是否指向同一位置
= = —— 为迭代器赋值(将所指元素的位置赋值过去)
begin() —— 返回一个迭代器,指向第一个元素
end() —— 返回一个迭代器,指向最后一个元素之后
注:
半开区间[beg, end)的好处:
(1)为遍历元素时循环的结束时机提供了简单的判断依据(只要未到达end(),循环就可以继续)
(2)不必对空区间采取特殊处理(空区间的begin()就等于end())
所有容器都提供两种迭代器
container::iterator以“读/写”模式遍历元素
container::const_iterator以“只读”模式遍历元素
2.迭代器的分类:
(1)双向迭代器
可以双向行进,以递增运算前进或以递减运算后退、可以用==和!=比较。
list、set和map提供双向迭代器
(2)随机存取迭代器
除了具备双向迭代器的所有属性,还具备随机访问能力。
可以对迭代器增加或减少一个偏移量、处理迭代器之间的距离或者使用<和>之类的关系运算符比较两个迭代器。
vector、deque和string提供随机存取迭代器
3. vector
vector模拟动态数组
vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)
注:必须包含的头文件#include
vector支持随机存取
vector的大小(size)和容量(capacity)
size返回实际元素个数,
capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器。
(1)构造、拷贝和析构
操作 效果
vector
vector
vector
vector
vector
~vector
(2)安插(insert)元素
c.insert(pos,e) ——在pos位置插入元素e的副本,并返回新元素位置
c.insert(pos,n,e) ——在pos位置插入n个元素e的副本
c.insert(pos,beg,end)——在pos位置插入区间[beg,end]内所有元素的副本
c.push_back(e) ——在尾部添加一个元素e的副本
(3)移除(remove)元素
c.pop_back() ——移除最后一个元素但不返回最后一个元素
c.erase(pos) ——删除pos位置的元素,返回下一个元素的位置
c.erase(beg,end) ——删除区间[beg,end]内所有元素,返回下一个元素的位置
c.clear() ——移除所有元素,清空容器
c.resize(num)——将元素数量改为num(增加的元素用defalut构造函数产生,多余的元素被删除)
c.resize(num,e)——将元素数量改为num(增加的元素是e的副本)
4. map/multimap
注:
@使用平衡二叉树管理元素
@元素包含两部分(key,value),key和value可以是任意类型
@必须包含的头文件#include
@根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢
@不能直接改变元素的key,可以通过operator []直接存取元素值
@map中不允许key相同的元素,multimap允许key相同的元素
(1)构造、拷贝和析构
map c ——产生空的map
map c1(c2) ——产生同类型的c1,并复制c2的所有元素
map c(op) ——以op为排序准则产生一个空的map
map c(beg,end)——以区间[beg,end]内的元素产生一个map
map c(beg,end,op)——以op为排序准则,以区间[beg,end]内的元素产生一个map
~ map() ——销毁所有元素并释放内存。
注:其中map可以是下列形式
map
map
(2)安插(insert)元素
c.insert(pos,e) ——在pos位置为起点插入e的副本,并返回新元素位置(插入速度取决于pos)
c.insert(e) ——插入e的副本,并返回新元素位置
c.insert(beg,end)——将区间[beg,end]内所有元素的副本插入到c中
(3)移除(remove)元素
c.erase(pos) ——删除迭代器pos所指位置的元素无返回值
c.erase(val) ——移除所有值为val的元素,返回移除元素个数
c.erase(beg,end) ——删除区间[beg,end]内所有元素,无返回值
c.clear() ——移除所有元素,清空容器
5. set/multiset
注:
@使用平衡二叉树管理元素
@集合(Set)是一种包含已排序对象的关联容器。
@必须包含的头文件#include
@map容器是键-值对的集合,好比以人名为键的地址和电话号码。相反地,set容器只是单纯的键的集合。当我们想知道某位用户是否存在时,使用set容器是最合适的。
头文件:#inlcude
在STL 的泛型算法中有4 类基本的算法:
变序型队列算法 :可以改变容器内的数据;
非变序型队列算法 :处理容器内的数据而不改变他们;
排序值算法: 包涵对容器中的值进行排序和合并的算法,还有二叉搜索算法、通用数值算法。(注:STL 的算法并不只是针对STL 容器,对一般容器也是适用的。)
变序型队列算法: 又叫可修改的序列算法。这类算法有复制( copy )算法、交换( swap )算法、替代( replace )算法、删除(clear )算法,移动( remove )算法、翻转( reverse )算法等等。这些算法可以改变容器中的数据(数据值和值在容器中的位置)。
begin() ——返回指向第一个元素的迭代器
clear() ——清除所有元素
count() ——返回某个值元素的个数
empty() ——如果集合为空,返回true
end() ——返回指向最后一个元素的迭代器
equal_range() ——返回集合中与给定值相等的上下限的两个迭代器
erase() ——删除集合中的元素
find() ——返回一个指向被查找到元素的迭代器
get_allocator() ——返回集合的分配器
insert() ——在集合中插入元素
lower_bound() ——返回指向大于(或等于)某值的第一个元素的迭代器
key_comp() ——返回一个用于元素间值比较的函数
max_size() ——返回集合能容纳的元素的最大限值
rbegin() ——返回指向集合中最后一个元素的反向迭代器
rend() ——返回指向集合中第一个元素的反向迭代器
size() ——集合中元素的数目
swap() ——集合中元素的数目
upper_bound() ——返回大于某个值元素的迭代器
value_comp()——返回一个用于比较元素间的值的函数
部分简单基础操作未点明
map 对象的行为和一般数组的行为类似。 map 允许两个或多个值使用比较操作符。
end() 实际上是取末尾加一,以便让循环正确运行-- 它返回的指针指向最靠近数组界限的数据。等等
一旦选定一种容器类型和数据行为( 算法) ,那么剩下唯一要他做的就是用迭代器使其相互作用,使用STL 编写的代码更容易修改和阅读,代码更短了,使用STL 的应用程序保证了得到的实现在处理速度和内存利用方面都是高效的,STL中算法的大部分都不作为某些特定容器类的成员函数,他们是泛型的,每个算法都有处理大量不同容器类中数据的使用。