【通俗易懂-C++ STL模板库】STL实用技术专题

STL( 标准模板库 )理论基础

 

1基本概念

STL (Standard Template Library,标准模板库 )是惠普实验室开发的一系列软件的统称。 现然主要出现在C++中,但在被引入 C++之前该技术就已经存在了很长的一段时间。 

 

STL的从广义上讲分为 三类:

algorithm (算法)、container(容器)和 iterator (迭代器),容器和算法 通过迭代器可以进行无缝地连接。

 

几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由 函数和类组成的库来说提供了更好的代码重用机会。在 C++标准中, STL 被组织为下面的 13 个头文件:

<algorithm>、<deque>、<functional> 、<iterator> 、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack>和<utility> 

 

 

STL详细的说六大组件 :

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

 

使用 STL的好处

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

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

 

(3) 程序员可以不用思考 STL具体的实现过程,只要能够熟练使用 STL就 OK 了。这样他们就可以把 精力放在程序开发的别的方面。

 

( 4) STL具有高可重用性,高性能,高移植性,跨平台的优点。

 

 高可重用性: STL 中几乎所有的代码都采用了模板类和模版函数的方式实现,这相 比于传统的由函数和类组成的库来说提供了更好的代码重用机会。

 

高性能:如 map 可以高效地从十万条记录里面查找出指定的记录,因为 map 是采 用红黑树的变体实现的。 (红黑树是平横二叉树的一种 ) 

 

高移植性:如在项目 A 上用 STL编写的模块,可以直接移植到项目 B上。 跨平台:如用 windows 的 Visual Studio 编写的代码可以在 Mac OS的 XCode上直接 编译。 

 

(5) 程序员可以不用思考 STL具体的实现过程,只要能够熟练使用 STL就 OK 了。这样 他们就可以把精力放在程序开发的别的方面。

 

( 6) 了解到 STL的这些好处,我们知道 STL无疑是最值得 C++程序员骄傲的一部分。每 一个 C++程序员都应该好好学习 STL。只有能够熟练使用 STL的程序员, 才是好的 C++程序员。

 

( 7) 总之:经常遇到 C++程序员对 STL不是非常了解。大多是有一个大致的映像,而对 于在什么情况下应该使用哪个容器和算法都感到比较茫然。 STL是 C++程序员的一项不可或缺的 基本技能 ,掌握它对提升 C++编程大有裨益。

 

如果问学习C++ STL需要学习那些内容,我个人觉得以下内容是值得掌握的,因为在项目中经常用到,所以今天跟大家分享一下。

 

STL概论

六大组件:   容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器

 

容器  Container 

序列式容器

关联式容器   有个key起到索引作用

 

算法   algorithm

质变算法

非质变算法

 

迭代器  iterator

双向

随机访问   (功能最强 ,可以支持跳跃式的访问)

 

优点

不需要安装东西,直接使用

高复用性、高移植、高性能

数据和算法分离,利用迭代器进行沟通

程序员可以不用思考 STL 具体的实现过程,只要能够熟练使用 STL 就               OK 了。这样他们就可以把精力放在程序开发的别的方面

 

 

容器算法迭代器初识

vector<类型> v  容器

插  v.push_back()

起始迭代器   v.begin()   指向容器中第一个元素

结束迭代器   v.end()     指向容器中最后一个元素下一个位置

for_each遍历    引入头文件  algorithm

 

string容器

构造、赋值

 

字符存取  [] at 区别

at 访问越界 抛出 out_of_range异常

[] 直接挂掉

 

拼接、查找、替换

 +=  append 拼接

  查找 find   查不到  返回 -1   rfind 从右往左查

 替换 replace

 

比较 compare

项目  = 1   字符串1 大  > 0 字符串1  小 <0

 

子串

string substr(int pos = 0, intn = npos) const;//返回由pos开始的n个字符组成的字符串

 

插入  insert

删除  erase

char * 和 string 转换

char * 转string   调用string有参构造  string str( “char *”)

  string 转 char*   .c_str() const char *

 编译器可以将  char * 隐式类型转换为string,反之不可以

写转大写  和 大写转小写

转大写 toupper

转小写 tolower

 

vector容器

与数组类型,但是是动态数组

动态分配内存并不是原有空间下分配,而是找一个新空间,将原有数据拷贝到新空间下,然后释放掉原有空间

  构造、赋值

 交换  swap

size  容器的大小

  capacity 容器的容量

empty  容器是否为空

 

 resize 重新指定容器长度

如果比原来长了,默认用0填充,可以用第二个参数代替默认值

 如果比原来短了,超出的部分元素就被删除掉了

 

reserve 预留空间,但是不初始化

  at、[] 对元素存取,at越界抛出异常 ,[]直接挂掉

  第一个元素 front

 最后一个元素 back

  插入  insert(迭代器)

删除  erase(迭代器 )

清空  clear

尾插 push_back 

尾删  pop_back

 

巧用swap来收缩内存

巧用reserve预留空间

逆序遍历   迭代器  reverse_iterator 

如果判断一个容器的迭代器是否支持随机访问

 

deque容器

双端数组  没有容量  内部用中控器控制连续分段空间

可以对头部进行插入删除

和vector的测试接口差不多

不同  头部插入push_front   头部 删除 pop_front

 

我个人觉得  多   是C++的精华,STL是C++的高级。如果没有学习STL相当于只掌握C++的一半内容。

所以个人觉得如果走C++方向,STL非常重要要。

 

每天进步一点点,如果觉得有用,想了解更多请关注微信公众号

 如果觉得有用点个赞支持一下!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值