一.定义
STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统称。现在主要出现在 C++ 中,但是在引入 C++ 之前该技术已经存在很长时间了。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码复用机会。
二.优点
1> STL 是 C++ 的一部分,因此无须额外安装,内嵌在编译器之内;
2> STL 的一个重要特点就是 数据结构与算法的分离,使得 STL 变得非常通用;
3> STL 的源码较为难懂,但是程序员无须思考STL具体的实现过程,只要能够熟练使用STL可;
4> STL 具有高可重用性,高性能,高移植性,跨平台的优点
高可重用性:STL中几乎所有代码均采用模板类和模板函数的方式实现,相比传统的由函数和 类组成的库来说提供了更好的代码复用机会。
高性能:较为高效;
高移植性:项目之间可直接移植;
跨平台:不同操作系统之间可以通用;
三.STL内容介绍(六大组件)
容器(Container):是一种数据结构,如vector(动态/可变数组)、list()、deque()、set(集合)、map等,用来存放数据。以模板类的方法提供,以迭代器的形式对容器中的数据进行访问 ;
容器的分类:
(1)序列式容器: 强调值的排序,序列式容器中的每个元素均有固定的位置--->由元素进入容 器的时机和地点来决定。
(1)关联式容器: 二叉树结构,各元素之间没有严格的物理上的顺序关系位置已经不是由元 素进入容器的时机和地点来决定。
迭代器(Iterator)各种常用的算法,如sort、find、copy、for_each等,提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。迭代器使用非常类似于指针,初学阶段我们可以先理解迭代器为指针。(每个容器都有自己专属的迭代器);
迭代器的种类如下(常用的容器有 双向迭代器 和 随机访问迭代器):
算法(Algorithm),通过有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法。STL 提供了大约100个实现算法的模板函数,例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象等 ;
适配器(Adaptor),一种用来修饰容器或者仿函数或迭代器接口的东西;
仿函数(Functor),行为类似函数,可作为算法的某种策略;
分配器/空间配置器(allocator),负责空间的配置与管理。
四.STL 容器算法迭代器分离案例(数组)
#include<iostream>
using namespace std;
// 算法,负责计算容器中 0元素的个数
int mycount(int* start,int* end,int val){
int num = 0;
while(start != end){
if(*start == val){
num++;
}
start++;
}
return num;
}
int main(){
// 数组容器
int arry[] = {0,7,5,4,9,2,0};
//设置迭代器
int* Pbegin =arry; //指向元素的第一个位置
int* Pend = &(arry[sizeof(arry)/sizeof(int)]); //指向最后一个元素的下一个位置
int num = mycount(Pbegin,Pend,0); //将迭代器给函数算法传参
cout<<"0的个数有: "<<num<<" 个"<<endl;
return 0;
}
结果如下:
结果分析:
定义容器存储元素,同时设置好迭代器,算法独立,但是要将迭代器作为参数对其进行传参;
五.STL 容器算法迭代器分离案例(基本数据类型和自定义类型)
基本数据类型(int)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
void printVector(int v){
cout<< v <<" ";
}
void room(){
// 定义容器并存储基本数据类型
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
vector<int>::iterator pBegin = v.begin();
vector<int>::iterator pEnd = v.end();
// 通过STL提供的for_each算法 , 并添加头文件
for_each(pBegin,pEnd,printVector);
}
int main(){
room();
return 0;
}
自定义类型:
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Person{
public:
Person(int num,int age):num(num),age(age){}
public:
int num;
int age;
};
void room(){
// 定义容器并存储自定义数据类型
Person p1(10,20),p2(30,40),p3(40,50),p4(56,90);
vector<Person> v;
v.push_back(p1);
v.push_back(p2);
v.push_back(p3);
v.push_back(p4);
// 通过for循环实现
for(vector<Person>::iterator it=v.begin();it != v.end();it++){
cout<< (*it).num<<" "<<(*it).age<<endl;
}
}
int main(){
room();
return 0;
}
参考资料:
该视频配套讲义:c++进阶(stl资源),非原创,配套b站(C++进阶之STL)教程-C/C++文档类资源-优快云下载
写在最后:
该博客是本人学习的一些总结,如果各位有不同见解,可以评论提出或者与我联系改正,谢谢阅览!!!