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非常重要要。
每天进步一点点,如果觉得有用,想了解更多请关注微信公众号
如果觉得有用点个赞支持一下!