c++STL总结.docx

上传人:b****6 文档编号:4988502 上传时间:2022-12-12 格式:DOCX 页数:21 大小:3.34MB
下载 相关 举报
c++STL总结.docx_第1页
第1页 / 共21页
c++STL总结.docx_第2页
第2页 / 共21页
c++STL总结.docx_第3页
第3页 / 共21页
c++STL总结.docx_第4页
第4页 / 共21页
c++STL总结.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

c++STL总结.docx

《c++STL总结.docx》由会员分享,可在线阅读,更多相关《c++STL总结.docx(21页珍藏版)》请在冰豆网上搜索。

c++STL总结.docx

c++STL总结

STL容器

C++标准模板库:

C++StandardTemplateLibarary。

主要内容:

(1)STL概述:

组件、容器、迭代器(iterator)、算法

(2)STL容器:

常用容器:

vector、deque、list、map/multimap、set

特殊容器:

stack、queue,priority_queue

其他容器:

hashtableSTL

(3)算法:

搜寻、排序、拷贝、数值运算

1.STL概述

1.1STL简介

(1)STL是C++标准程序库的核心,深刻影响了标准程序库的整体结构。

(2)STL是泛型(generic)程序库,利用先进、高效的算法来管理数据。

(3)STL由一些可适应不同需求的集合类(collectionclass),以及在这些数据集合上操作的算法(algorithm)构成。

(4)STL内的所有组件都由模板(template)构成,其元素可以是任意类型。

(5)STL是所有C++编译器和所有操作系统平台都支持的一种库。

例:

//普通C++代码

#include

intmain(void){

doublea[]={1,2,3,4,5};

std:

:

cout<

std:

:

cout<

:

endl;

return0;

}

//使用了STL的代码

#include

#include

intmain(){

std:

:

vectora;

a.push_back

(1);

a.push_back

(2);

a.push_back(3);

a.push_back(4);

a.push_back(5);

for(inti=0;i

std:

:

cout<

:

endl;

}

return0;

}

1.2模板(template)

针对一个或多个尚未明确的类型所撰写的函数或类。

1.2.1函数模板

#include

#include

usingnamespacestd;

//定义函数模板

template

TMAX(Ta,Tb){

return(a>b)?

a:

b;

}

intmain(){

intx=2,y=6;

doublex1=9.123,y1=12.6543;

cout<

cout<

return0;

}

1.2.2类模板

//类模板

#include

usingnamespacestd;

//定义名为ex_class的类模板

template

classex_class{

Tvalue;

public:

ex_class(Tv){

value=v;

}

voidset_value(T,v){

value=v;

}

Tget_value(void){

returnvalue;

}

};

intmain(){

//测试char类型数据

ex_classch('A');

cout<<"ch.value:

"<

ch.set_value('a');

cout<<"ch.value:

"<

//测试double类型的数据

ex_classd(5.5);

cout<<"d.value:

"<

x.set_value(7.4);

cout<<"x.value:

"<

return0;

}

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)

产生一个空容器

std:

:

listl;

以另一个容器元素为初值完成初始化。

std:

:

listl;

std:

:

vectorc(l.begin(),l.end());

以数组元素为初值完成初始化。

intarray[]={2,4,6,1345};

std:

:

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以“读/写”模式遍历元素。

container:

:

const_iterator以“只读”模式遍历元素。

(6)迭代器示例:

iterator

1.8.2迭代器分类

(1)双向迭代器

例:

listl;

for(pos=l.begin();pos!

=l.end();++pos{

}

1)可以双向行进,以递增运算前进或以递减运算后退、可以用==和!

=比较。

2)list、set和map提供双向迭代器。

(2)随机存取迭代器

1)除了具备双向迭代器的所有属性,还具备随机访问能力。

2)可以对迭代器增加或减少一个偏移量、处理迭代器之间的距离或者使用<和>之类的关系运算符比较两个迭代器。

3)vector、deque和string提供随机存取迭代器

vectorv;

for(pos=v.begin();pos

}

2.STL容器

2.1vector容器

2.1.1vector容器的特点

(1)vector模拟动态数组。

(2)vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)。

(3)必须包含的头文件#include< vector>

(4)vector支持随机存取

(5)vector的大小(size)和容量(capacity)

size返回实际元素个数。

capacity返回vector能容纳的元素最大数量。

如果插入元素时,元素个数超过capacity,需要重新配置内部存储器。

2.1.2vector的构造、拷贝和析构

2.1.3vector非变动操作

2.1.4vector的赋值操作

所有的赋值操作都有可能调用元素类型的默认构造函数,拷贝构造函数,赋值操作符和析构函数。

std:

:

listl;

std:

:

vector v;

v.assign(l.begin(),l.end());

2.1.5vector元素存取

std:

:

vectorv;//empty

v[5]=t;//runtimeerror

std:

:

cout<

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 

(4)list不支持随机存取,因此不提供下标操作符。

(5)在任何位置上执行元素的安插和移除都非常快。

(6)安插和删除不会导致指向其他元素的指针、引用、iterator失效。

2.2.2list构造、拷贝和析构

2.2.3非变动性操作

2.2.4list赋值

2.2.5list元素存取

std:

:

listl;//empty

std:

:

cout<

if(!

l.empty()){

std:

:

cout<

}

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

(4)根据元素的key自动对元素排序,因此根据元素的key进行定位很快,但根据元素的value定位很慢。

(5)不能直接改变元素的key,可以通过operator[]直接存取元素值。

(6)map中不允许key相同的元素,multimap允key相同的元素。

(7)map/multimap内部存储结构图:

2.3.2map/multimap构造、拷贝和析构

其中map可以是下列形式:

map一个以less(<)为排序准则的map。

map一个以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 #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排序算法

需要动用随机存取迭代器。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 职业规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1