c++STL总结Word文件下载.docx
《c++STL总结Word文件下载.docx》由会员分享,可在线阅读,更多相关《c++STL总结Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。
mean(a,5);
std:
endl;
return0;
}
//使用了STL的代码
vector>
intmain(){
vector<
double>
a;
a.push_back
(1);
a.push_back
(2);
a.push_back(3);
a.push_back(4);
a.push_back(5);
for(inti=0;
i<
a.size();
++i){
std:
a[i]<
}
1.2模板(template)
针对一个或多个尚未明确的类型所撰写的函数或类。
1.2.1函数模板
#include<
string>
usingnamespacestd;
//定义函数模板
template<
typenameT>
TMAX(Ta,Tb){
return(a>
b)?
a:
b;
intmain(){
intx=2,y=6;
doublex1=9.123,y1=12.6543;
cout<
max(x,y)<
max(x1,y1)<
1.2.2类模板
//类模板
//定义名为ex_class的类模板
template<
typenameT>
classex_class{
Tvalue;
public:
ex_class(Tv){
value=v;
}
voidset_value(T,v){
Tget_value(void){
returnvalue;
};
//测试char类型数据
ex_class<
char>
ch('
A'
);
"
ch.value:
ch.get_value()<
ch.set_value('
a'
engl;
//测试double类型的数据
d(5.5);
d.value:
d.get_value()<
x.set_value(7.4);
x.value:
x.get_value()<
1.3STL组件
(1)容器(Container)-管理某类对象的集合
(2)迭代器(Iterator)-在对象集合上进行遍历
(3)算法(Algorithm)-处理集合内的元素
(4)容器适配器(containeradaptor)
(5)函数对象(functor)
1.4STL容器类别
(1)序列式容器----排列次序取决于插入时机和位置。
(2)关联式容器----排列顺序取决于特定准则。
1.5STL容器的共通能力
(1)所有容器中存放的都是值而非引用,即容器进行安插操作时内部实施的是拷贝操作。
因此容器的每个元素必须能够被拷贝。
如果希望存放的不是副本,容器元素只能是指针。
(2)所有元素都形成一个次序(order),可以按相同的次序一次或多次遍历每个元素。
(3)各项操作并非绝对安全,调用者必须确保传给操作函数的参数符合需求,否则会导致未定义的行为。
1.6STL容器元素的条件
(1)必须能够通过拷贝构造函数进行复制。
(2)必须可以通过赋值运算符完成赋值操作。
(3)必须可以通过析构函数完称销毁动作。
(4)序列式容器元素的默认构造函数必须可用。
(5)某些动作必须定义operator==,例如搜寻操作。
(6)关联式容器必须定义出排序准则,默认情况是重载。
operator<
>
对于基本数据类型(int,long,char,double,…)而言,以上条件总是满足
1.7STL容器的共通操作
(1)初始化(initialization)
产生一个空容器
list<
int>
l;
以另一个容器元素为初值完成初始化。
…
float>
c(l.begin(),l.end());
以数组元素为初值完成初始化。
intarray[]={2,4,6,1345};
setc(array,array+sizeof(array)/sizeof(array[0]));
(2)与大小相关的操作(sizeoperator)
size()----返回当前容器的元素数量。
empty()-----判断容器是否为空。
max_size()-----返回容器能容纳的最大元素数量。
(3)比较(comparison)
==,!
=,<
<
=,>
>
=
1)比较操作两端的容器必须属于同一类型。
2)如果两个容器内的所有元素按序相等,那么这两个容器相等。
3)采用字典式顺序判断某个容器是否小于另一个容器
。
(4)赋值(assignment)和交换(swap)
swap用于提高赋值操作效率。
(5)与迭代器(iterator)相关的操作
begin()----返回一个迭代器,指向第一个元素。
end()----返回一个迭代器,指向最后一个元素之后。
rbegin()----返回一个逆向迭代器,指向逆向遍历的第一个元素。
rend()----返回一个逆向迭代器,指向逆向遍历的最后一个元素之后。
(6)元素操作
insert(pos,e)----将元素e的拷贝安插于迭代器pos所指的位置。
erase(beg,end)----移除[beg,end]区间内的所有元素。
clear()----移除所有元素。
1.8迭代器(iterator)
1.8.1迭代器的特点
(示例:
iterator)
(1)可遍历STL容器内全部或部分元素的对象。
(2)指出容器中的一个特定位置。
(3)迭代器的基本操作:
(4)所有容器都提供获得迭代器的函数
半开区间[beg,end)的好处:
1.为遍历元素时循环的结束时机提供了简单的判断依据(只要未到达end(),循环就可以继续)。
2..不必对空区间采取特殊处理(空区间的begin()就等于end())
(5)所有容器都提供两种迭代器
container:
iterator以“读/写”模式遍历元素。
const_iterator以“只读”模式遍历元素。
(6)迭代器示例:
iterator
1.8.2迭代器分类
(1)双向迭代器
l;
for(pos=l.begin();
pos!
=l.end();
++pos{
1)可以双向行进,以递增运算前进或以递减运算后退、可以用==和!
=比较。
2)list、set和map提供双向迭代器。
(2)随机存取迭代器
1)除了具备双向迭代器的所有属性,还具备随机访问能力。
2)可以对迭代器增加或减少一个偏移量、处理迭代器之间的距离或者使用<
和>
之类的关系运算符比较两个迭代器。
3)vector、deque和string提供随机存取迭代器
vector<
v;
for(pos=v.begin();
pos<
v.end();
++pos{
…
2.STL容器
2.1vector容器
2.1.1vector容器的特点
(1)vector模拟动态数组。
(2)vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)。
(3)必须包含的头文件#include<
(4)vector支持随机存取
(5)vector的大小(size)和容量(capacity)
size返回实际元素个数。
capacity返回vector能容纳的元素最大数量。
如果插入元素时,元素个数超过capacity,需要重新配置内部存储器。
2.1.2vector的构造、拷贝和析构
2.1.3vector非变动操作
2.1.4vector的赋值操作
所有的赋值操作都有可能调用元素类型的默认构造函数,拷贝构造函数,赋值操作符和析构函数。
T>
v;
v.assign(l.begin(),l.end());
2.1.5vector元素存取
//empty
v[5]=t;
//runtimeerror
cout<
v.front();
//runtimeerror
2.1.6vector迭代器相关函数
迭代器持续有效,除非发生以下两种情况:
(1)删除或插入元素。
(2)容量变化而引起内存重新分配。
2.1.7vector安插(insert)元素
2.1.8vector移除(remove)元素
2.1.9vector应用实例
备注:
2.2list容器
2.2.1特点
(1)使用双向链表管理元素。
(2)list的元素可以是任意类型T,但必须具备赋值和拷贝能力。
(3)必须包含的头文件#include
list>
(4)list不支持随机存取,因此不提供下标操作符。
(5)在任何位置上执行元素的安插和移除都非常快。
(6)安插和删除不会导致指向其他元素的指针、引用、iterator失效。
2.2.2list构造、拷贝和析构
2.2.3非变动性操作
2.2.4list赋值
2.2.5list元素存取
l.front();
if(!
l.empty()){
l.back();
//ok
2.2.6list迭代器相关函数
2.2.7list安插(insert)元素
2.2.8list移除(remove)元素
2.2.9list特殊变动性操作
2.2.10list应用实例
2.3map容器
2.3.1map/multimap特点
(1)使用平衡二叉树管理元素。
(2)元素包含两部分(key,value),key和value可以是任意类型。
(3)必须包含的头文件#include<
map>
(4)根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢。
(5)不能直接改变元素的key,可以通过operator[]直接存取元素值。
(6)map中不允许key相同的元素,multimap允key相同的元素。
(7)map/multimap内部存储结构图:
2.3.2map/multimap构造、拷贝和析构
其中map可以是下列形式:
map<
key,value>
一个以less(<
)为排序准则的map。
key,value,op>
一个以op为排序准则的map。
2.3.3map/multimap非变动性操作
2.3.4map/multimap赋值
2.3.5map/multimap特殊搜寻操作
2.3.6map/multimap迭代器相关函数
2.3.7map/multimap安插(insert)元素
2.3.8map/multimap移除(remove)元素
2.3.9map/multimapmap应用实例
map
3.STL算法
(1)STL提供了一些标准算法来处理容器内的元素。
搜寻、排序、拷贝、数值运算。
(2)STL的算法是全局函数
a.明确划分数据和操作。
b.泛型函数式编程模式。
c.所有算法可以对所有容器适用,甚至可以操作不同类型容器的元素
(3)算法头文件
#include
(4)STL算法实例:
algorithm
3.1区间(range)
(1)所有算法都用来处理一个或多个区间内的元素。
(2)区间可以但不一定涵盖容器内所有元素。
(3)为了操作元素的某个子集必须将区间的首尾(iterator)当作两个参数传递给算法。
(4)调用时必须确保区间有效性。
a.从起点出发,逐一前进,能够到达终点。
b.区间首尾两个迭代器必须属于同一容器,且前后放置正确。
c.无效区间可能会引起无限循环或者内存非法访问
(5)所有算法处理的都是半开区间[begin,end)。
3.2STL算法分类
(1)非变动性算法(nonmodifyingalgorithms)
(2)变动性算法(modifyingalgorithms)
(3)移除性算法(removingalgorithms)
(4)变序性算法(mutatingalgorithms)
(5)排序性算法(sortingalgorithms)
(6)已序区间算法(sortedrangealgorithms)
(7)数值算法(numericalgorithms)
3.3for_each()算法
for_each(InputIteratorbeg,InputIteratorend,UnaryProcop)
对区间[beg,end)中的每一个元素调用。
op(elem)返回op之后的容器副本。
op可以改变元素。
op的返回值被忽略。
复杂度:
O(n)
示例:
foreach
3.4非变动性算法
既不改变元素次序也不改变元素值
3.4.1元素计数
(1)count(InputIteratorbeg,InputIteratorend,constT&
value)
计算区间中值等于value的元素个数。
(2)count(InputIteratorbeg,InputIteratorend,Predicateop)
计算区间中使判断式op结果为true的元素个。
op接受单个参数,返回值为bool型。
3.4.2排序算法
需要动用随机存取迭代器。