STL是C++标准程序库的核心,深刻影响了标准程序库的整体结构
stl组件
容器(Container) - 管理某类对象的集合
迭代器(Iterator) - 在对象集合上进行遍历
算法(Algorithm) - 处理集合内的元素
容器适配器(container adaptor)
函数对象(functor)
vector 为了使用vector,必须包含头文件<vector>
vector模拟动态数组
vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)
必须包含的头文件#include <vector>
vector支持随机存取
vector的大小(size)和容量(capacity)
size返回实际元素个数,
capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器
vec.begin()//指向迭代器中第一个元素。
vec.end()//指向迭代器中末端元素的下一个,指向一个不存在元素。
vec.push_back(elem) //在尾部加入一个数据。
vec.pop_back() //删除最后一个数据。
vec.capacity() //vector可用空间的大小。
vec.size()//返回容器中数据个数。
vec.empty() //判断容器是否为空。
vec.front() //传回第一个数据。
vec.back() //传回最后一个数据,不检查这个数据是否存在。
vec.at(index) //传回索引idx所指的数据,如果idx越界,抛出out_of_range。
vec.clear() //移除容器中所有数据。
vec.erase(iterator) //删除pos位置的数据,传回下一个数据的位置。
vec.erase(begin,end) //删除[beg,end)区间的数据,传回下一个数据的位置。注意:begin和end为iterator
vec.insert(position,elem) //在pos位置插入一个elem拷贝,传回新数据位置。
vec.insert(position,n,elem) //在pos位置插入n个elem数据,无返回值。
vec.insert(position,begin,end) //在pos位置插入在[beg,end)区间的数据,无返回值。
(1)头文件#include<vector>.
(2)创建vector对象,vector<int> vec;
(3)尾部插入数字:vec.push_back(a);
(4)使用下标访问元素,cout<<vec[0]<<endl;记住下标是从0开始的。
(5)使用迭代器访问元素.
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
(7)删除元素: vec.erase(vec.begin()+2);删除第3个元素
vec.erase(vec.begin()+i,vec.end()+j);删除区间[i,j-1];区间从0开始
(8)向量大小:vec.size();
(9)清空:vec.clear();
map
使用平衡二叉树管理元素
元素包含两部分(key,value),key和value可以是任意类型
必须包含的头文件#include <map>
根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢
不能直接改变元素的key,可以通过operator[]直接存取元素值
map中不允许key相同的元素,multimap允许key相同的元素
构造 拷贝 复制
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() |
销毁所有元素并释放内存。 |
非变动性操作
c.size() |
返回元素个数 |
c.empty() |
判断容器是否为空 |
c.max_size() |
返回元素最大可能数量 |
c1==c2 |
判断c1是否等于c2 |
c1!=c2 |
判断c1是否不等于c2 |
c1<c2 |
判断c1是否小于c2 |
c1>c2 |
判断c1是否大于c2 |
c1<=c2 |
判断c1是否大于等于c2 |
c1>=c2 |
判断c1是否小于等于c2 |
赋值
c1 = c2 |
将c2的全部元素赋值给c1 |
c1.swap(c2) |
将c1和c2的元素互换 |
swap(c1,c2) |
同上,全局函数 |
特殊搜寻操作
count(key) |
返回”键值等于key”的元素个数 |
find(key) |
返回”键值等于key”的第一个元素,找不到返回end |
lower_bound(key) |
返回”键值大于等于key”的第一个元素 |
upper_bound(key) |
返回”键值大于key”的第一个元素 |
equal_range(key) |
返回”键值等于key”的元素区间 |
迭代器相关函数
begin() |
返回一个双向迭代器,指向第一个元素 |
end() |
返回一个双向迭代器,指向最后一个元素之后 |
rbegin() |
返回一个逆向迭代器,指向逆向遍历的第一个元素 |
rend() |
返回一个逆向迭代器,指向逆向遍历的最后一个元素 |
安插(insert)元素
c.insert(pos,e) |
在pos位置为起点插入e的副本,并返回新元素位置(插入速度取决于pos) |
c.insert(e) |
插入e的副本,并返回新元素位置 |
c.insert(beg,end) |
将区间[beg,end]内所有元素的副本插入到c中 |
set
使用平衡二叉树管理元素
集合(Set)是一种包含已排序对象的关联容器。
必须包含的头文件#include <set>
map容器是键-值对的集合,好比以人名为键的地址和电话号码。相反地,set容器只是单纯的键的集合。当我们想知道某位用户是否存在时,使用set容器是最合适的。
set中不允许key相同的元素,multiset允许key相同的元素
排序和查找
find
template<class InIt,class T>
InItfind(InItfirst, InItlast, const T& val);
返回区间 [first,last)中的迭代器i,使得*i== val
2) find_if
template<class InIt,class Pred>
InItfind_if(InItfirst, InItlast, Predpr);
返回区间 [first,last)中的迭代器i,使得pr(*i)== true
总结:
其中vector是一种定义新形势数组的方式,它的空间容量可以随时扩大,满足需要;
map是根据关键字进行快速排序查找,使用这些模板库有很多需要的功能,通过这些功能我们可以进行方便的计算,实现功能;
使用迭代器进行访问对象,所有容器中存放的都是值而非引用。如果希望存放的不是副本,容器元素只能是指针。
所有元素都形成一个次序(order),可以按相同的次序一次或多次遍历每个元素。
关联式容器必须定义出排序准则,默认情况是重载operator <