C++复习之路(五)——STL标准模板库

一、STL概述。

1、基本概念

STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件统称。

STL从广义上讲分为三类:algorithm(算法)、container(容器)和 iterator(迭代器)。容器和算法可以通过迭代器无缝地连接。几乎所有代码都采用了模板类和模板函数的方式。相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面13个头文件中:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>、<utility>。

老师这张图太形象了,必须放上来,感觉当初没学到精髓。容器就是存数据的地方,不同的数据根据其特点选用不同的容器,算法就是处理数据的地方。为了使得算法和存数据的地方足够通用,所以使用上了模板。为了使得算法能够对数据的处理,于是有了迭代器。

(1)STL六大组件

容器(Container)、算法(Algorithm)、迭代器(Iterator)、仿函数(Function object)、适配器(Adaptor)、空间配置器(allocator)。

(2)STL的优点

STL是C++的一部分,因此不用额外安装什么,它被内建在你的编译器之内。

STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但是这种分离使得STL变得非常通用。例如:STL的容器中,可以放入元素、基础数据类型变量、元素的地址等。STL中的sort()函数可以用来操作vector、list等容器。

程序员可以不用思考STL的具体实现过程,只要能够熟练掌握使用STL就可以。

STL具有高可重用性,高性能,高移植性,跨平台的优点。高重用性:STL几乎所有的代码都采用了模板类和模板函数的方式实现;高性能:如map可以高效地从十几万条记录里面查找出指定的记录,因为map指定的时采用红黑树的变体实现的。(红黑树是平衡二叉树的一种)

2、容器container

在实际的开发过程中,当程序存在着对时间要求很高的部分时,数据结构的选择就显得很重要。STL容器为我们提供特定类型下的数据结构,通过设置一些模板,STL容器对常用的数据结构提供了支持,这些模板的参数允许我们制定容器中元素的数据类型。容器部分主要头文件<vector>、<list>、<deque>、<set>、<map>、<stack>和<queue>组成。

(1)容器的概念

用来管理一组数据。

各种类型的容器的形象示意图

(2)容器的分类

序列式容器(Sequence containers)

每个容器有一个固定位置——取决于插入时机和地点,和元素值无关。如vector、deque、list。

关联式容器(Associated containers)

元素位置取决于特定的排序准则,和插入顺序无关。如set、multiset、map、multimap

3、迭代器iterator

迭代器在STL中用来将算法和容器联系起来,起着一种黏合剂的作用,几乎所有的STL提供的所有算法都是通过迭代器存取元素序列进行工作的。每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。迭代器部分主要由头文件<utility>、<iterator>和<memory>组成

4、算法alogrithm

C++利用模板的机制允许推迟某些类型的选择,STL利用这一点提供了相当多的有用算法,在一个有效的框架中完成这些算法——将所有的数据类型划分为少数的几类,就可以在模板参数中使用一种类型代替同一种类的其他类型。STL实现了大约100个实现算法的模板函数。算法部分主要由头文件<algorithm> <numeric>和<functional>组成。

5、C++标准库

太多太多了,我可以抽空再好好理吗。。。。。

 

二、容器

1、string

(1)string的概念

string是STL的字符串类型,通常用来表示字符串。string和char *的比较:string是一个类,char *是一个指向字符的指针;string中封装了char *,管理这个字符串是一个char *型的容器string不用考虑内存释放和越界问题,string管理char *所分配的内存,每一个string复制,取值都由string类维护;string提供了一系列的字符串操作函数:查找find、拷贝copy、删除erase、替换replace、插入insert。

(2)string的构造函数

string();                         //默认构造函数,构造一个空的字符串string s1

string(const string &str);  //拷贝构造函数,构造一个和str一样的string

string(const  char *s);  //带参构造函数,用字符串s初始化

string(int n, char c);             //带参构造函数,用n个字符c初始化

(3)string类的存取操作

connst char &operator [](int n)  const;     //   [ ]在刚好越界的时会返回char(0) zai

const char & at(int n) const;                   //at()在越界时抛出异常

 (4)从string取得const char *的操作

const char * c_str() const;       //返回一个以'\0'结尾的字符串的首地址

(5)从stirng拷贝到指向char *指向的内存空间的操作

int copy(char *s, int n, int pos = 0) const;  //把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷                                                                     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值