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

2018-10-19  本文已影响23人  编程小兔崽

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

1基本概念

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

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

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

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

、、 、 、、、、、、、、和 

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非常重要要。

每天进步一点点,开开心心过好每一天

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

上一篇下一篇

猜你喜欢

热点阅读