我想要告诉我什么是STL,也想告诉你什么是STL。

我想告诉我什么是STL,也想告诉你什么是STL。

  • 什么是大名鼎鼎的STL
    • L
    • T
    • S
    • 小结
  • STL作者
  • STL组成
    • 组成图示
    • STL如何工作
  • STL分类标准
  • 总结

什么是大名鼎鼎的STL

开始说明STL之前先来告诉大家一句话,如果你通过我的博客看懂了STL,或者有所收获必定会对于这句话有着更加深刻的哲学理解。
这句话就是:如果说我看得远,那是因为我站在巨人的肩膀上。

STL对于C++程序员来说非常重要,因为我们在使用C++开发业务逻辑代码的过程中,必定会使用到STL。当然如果你是要面试,那么我也希望我能帮你更加深刻的理解STL,让你在面试中面试官问到STL的内容时,你能够有自己的理解和思路。

L

好了进入正题,接下来我们说明大名鼎鼎的STL。
首先,什么是STL呢?
STL = Standard Template Library。
Library 表示STL是一个函数库。

函数库的目的又是什么呢?函数库又是干什么用的呢?
库存在的目的就是重复避免造轮子。
我们学习过C语言和C++语言必定知道函数库用来解决一类问题,库里面整合了大量的函数。我们举例子进行说明:
就像大家以前用的函数sin/random等来自数学库。
printf/fopen/fread/fwrite等来自 io 库。
strcpy/strcmp/strcat 等来自字符串库。

每一种函数库都解决了一类问题。比如数学库,解决通用数据运算问题,io 库解决了输入输出问题, 字符串库解决了字符串的生成,复制,拼接等等问题。
所以说函数库的存在就是避免了重复造轮子,提高了开发效率。

STL 作为一个库,解决了哪些问题呢?
就是很多读者包括我在内都很头疼的问题,数据结构与算法。从此呢,数据结构和算法,不再是王谢堂前燕,经过 STL 后,己飞入寻常百姓家了。

T

那么接下来 T 也就是 Template
Template 中文是模板的意思,模板解决了什么问题呢?
核心的一句话就是:模板解决了泛型编程的问题。
模板抹平了数据类型的差异,我们说STL中的算法,算法是解决问题的步骤,那么就不关系操作的是什么类型的数据。而是关系如何操作数据。
例如:排序,我们并不关心对于什么数据进行排序,更加关心的是排序的思想,如何来搬运数据。

C++引入Template 后,泛型编程才算是落到了实处,其实也是解决避免重复造轮子,提高开发效率的问题。

S

那么最后就是Standard 标准。
为什么说是标准呢?
STL 己经被 C++委员会纳入 C++标准的一部分。以前说 C++有三大特征,封装,继承,多态。现在至少要说,C++四大特征 封装,继承,多态和 STL。

小结

STL 是由 C++模板编写的一套己纳入 c++标准的类库,该库解决了通用
数据结构与算法的问题。

STL作者

STL 它是由 Alexander Stepanov、Meng Lee 和 David R Musser 在惠普实验室工作时所开发出来的。亚历山大·斯特潘诺夫(AlexanderStepanov),STL(标准模板库)之父,并因此而荣获第一届 Dr. Dobb’s 程序设计杰出奖, 现在是 Adobe 公司首席科学家。他曾是康柏电脑公司的副总裁和首席科学家,AT&T 实验室副总裁和首席架构师,SGI 服务和超级计算机业务首席技术官。

我想要告诉我什么是STL,也想告诉你什么是STL。_第1张图片

上面的作者就是简单介绍一下,读者可以了解一下,既然要学习STL,就要了解STL的发明者。

接下来送给所有读者STL作者说过的一句话:
程序基于精确的数学——STL 之父 Alex Stepanov。

STL组成

组成图示

STL 主要由空间适配器 allocator,容器 container,算法 algorithm,迭代器iterator 和仿函数 functor。
我想要告诉我什么是STL,也想告诉你什么是STL。_第2张图片
STL里面核心的是容器和算法。

STL的设计有点违背OO的思想:
容器用来存放数据,算法用来操作数据,也就是行为。
OO的思想是数据和行为统一。
但是上面的图示中数据和方法是分开的,所以我们说设计上有违背OO的思想。
从宏观上来说,STL是一个整体那就是OO的思想,但是如果从内部来看就有点违背OO的思想。

通过迭代器把容器和算法进行连接。
仿函数起到了算法决策的作用,也就是对于容器中的数据进行操作的条件。

STL如何工作

接下来我们看STL的几大部件如何来进行工作?
代码演示:

#include 
#include //包含头文件
#include 
using namespace std;

class Cpmpare
{
     
public:
	bool operator()(int i, int j)	//仿函数
	{
     
		return i > j;
	}
};

class Mycompare
{
     
public:
	bool operator()(int& v)	//仿函数
	{
     
		return v > 5;
	}
};

int main()
{
     
	int arr[10] = {
      1,3,5,7,9,2,4,6,8,10 };
	vector<int, allocator<int>> vi;
	//前面的int 表示容器中存放数据成员的类型
	//allocator  是类模板 
	//类模板 + int   生成模板类(代表一种类型   等价于 int/char)
	//allocator  是空间配置器/内存申请器,用于申请容器中数据的内存空间 
	//vector> vi	模板类生成 vi 对象
	
	vi.assign(arr, arr + 10);	//assign:赋值
	//使用时没有声明vi的大小,也不用关心vi能够存放多少数据
	
	//迭代器功能:架起了容器和算法之间的桥梁
	vector<int, allocator<int>>::iterator itr;	//迭代器

	for (itr = vi.begin(); itr != vi.end(); ++itr)	//遍历打印数据
	{
     
		cout << *itr << " ";
	}
	cout << endl;

	//itr的行为和指针相同。
	//itr是一个智能指针(自动管理内存)
	//智能指针是一个对象,可以用指针的形式使用。
	//itr的本质是对于底层指针的封装,让对象具备了指针的特性。

	int* p = nullptr;
	for (p = arr; p != arr + 10; p++)	//打印数据
	{
     
		cout << *p << " ";
	}
	cout << endl;
	
	//排序算法  需要包含#include 
	sort(vi.begin(), vi.end(), Cpmpare()); 

	
	//第三个参数只需要可调用对象即可,可调用对象包括:函数指针,仿函数。
	//正规的用法第三个参数存放的是放仿函数。
	//仿函数在STL里面应用广泛
	//仿函数的本质是通过对象调用,不能通过类型调用。

	for (auto& i : vi)//C++11打印方法
	{
     
		cout << i << endl;
	}
	
	//统计大于5的数据有几个
	int count = count_if(vi.begin(), vi.end(), Mycompare());
	
	cout << "count = " << count << endl;
	return 0;
}

图解分析:
我想要告诉我什么是STL,也想告诉你什么是STL。_第3张图片

上面通过不同的颜色框图对于STL的结构对应的代码进行对应。

关于bind和function我们只是在这里简单提出,如果刨析会比较麻烦,但是最核心的心法给大家说明,想要详细了解的读者可以自行搜索或者看我对应博客,因为在这里不影响STL的说明,所以不多赘述。
bind:实现了可调用对象 + 参数,绑定为一个新的可调用对象。
解决了 对象 + 参数的问题。

funcation:起到了统一接口的功能,具有取代多态的趋势。

STL分类标准

我想要告诉我什么是STL,也想告诉你什么是STL。_第4张图片

总结

你可能感兴趣的:(STL)