首页 > 其他分享 >STL(标准模板库)理论基础

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

时间:2024-07-18 15:25:19浏览次数:15  
标签:容器 头文件 迭代 STL 标准 算法 vector 模板

STL标准模板库理论基础

基本概念

STL的从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),容器和算法通过迭代器可以进行无缝地连接。

使用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++程序员。

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

容器

STL容器就是将运用最广泛的一些数据结构实现出来。

常用的数据结构不在乎,数组(array),链表(list),tree(树),栈(stack),队列(queue),集合(set),映射表(map),根据数据在容器中的排列特性,这些数据分为序列式容器和关联式容器两种。

在这里插入图片描述

容器的分类

  1. 序列式容器(Sequence containers)
    每个元素都有固定位置--取决于插入时机和地点,和元素值无关。
    vector、deque、list
  2. 关联式容器(Associated containers)
    元素位置取决于特定的排序准则,和插入顺序无关
    set、multiset、map、multimap

迭代器

迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通 过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。

迭代器部分主要由头文件<utility>,<iterator>和<memory>组 成。

<utility>是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,

<iterator>中提供了迭代器 使用的许多方法,

而对于<memory>的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生 的临时对象提供机制,<memory>中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。

算法

以有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms).

广义而言,我们所编写的每个程序都是一个算法,其中的每个函数也都是一个算法,毕竟它们都是用来解决或大或小的逻辑问题或数学问题。

STL收录的算法经过了数学上的效能分析与证明,是极具复用价值的,包括常用的排序,查找等等。

特定的算法往往搭配特定的数据结构,数据结构是问题的载体,算法与数据结构相辅相成。
算法分为:质变算法和非质变算法。

  1. 质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等
  2. 非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等

迭代器

迭代器(iterator)是一种抽象的设计概念,现实程序语言中并没有直接对应于这个概念的实物。在<<Design Patterns>>一书中提供了23中设计模式的完整描述,其中iterator模式定义如下:提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方式。

迭代器的设计思维-STL的关键所在,STL的中心思想在于将数据容器(container)和算法(algorithms)分开,彼此独立设计,最后再一贴胶着剂将他们撮合在一起。从技术角度来看,容器和算法的泛型化并不困难,c++的class template和function template可分别达到目标,如果设计出两这个之间的良好的胶着剂,才是大难题。

C++标准库

C++强大的功能来源于其丰富的类库及库函数资源。C++标准库的内容总共在50个标准头文件中定义。在C++开发中,要尽可能地利用标准库完 成。这样做的直接好处包括:
(1)成本:已经作为标准提供,何苦再花费时间、人力重新开发呢;
(2)质量:标准库的都是经过严格测试的,正确性有保证;
(3)效率:关于人的效率已经体现在成本中了,关于代码的执行效率要相信实现标准库的大牛们的水平;
(4)良好的编程风格:采用行业中普遍的做法进行开发。

标准库中与语言支持功能相关的头文件

在这里插入图片描述

支持流输入/输出的头文件

在这里插入图片描述

与诊断功能相关的头文件

在这里插入图片描述

定义工具函数的头文件

在这里插入图片描述

支持字符串处理的头文件

在这里插入图片描述

定义容器类的模板的头文件

在这里插入图片描述

支持迭代器的头文件

在这里插入图片描述

有关算法的头文件

在这里插入图片描述

有关数值操作的头文件

在这里插入图片描述

有关本地化的头文件

在这里插入图片描述

案例

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
#include<algorithm>
usingnamespace std;

//STL 中的容器 算法 迭代器
void test01(){
	vector<int> v;//STL 中的标准容器之一 :动态数组
	v.push_back(1);//vector 容器提供的插入数据的方法
	v.push_back(5);
	v.push_back(3);
	v.push_back(7);
	//迭代器
	vector<int>::iterator pStart = v.begin();//vector 容器提供了 begin()方法 返回指向第一个元素的迭代器
	vector<int>::iterator pEnd = v.end();//vector 容器提供了 end()方法 返回指向最后一个元素下一个位置的迭代器
	//通过迭代器遍历
	while(pStart != pEnd){
		cout <<*pStart <<" ";
		pStart++;
	}
	cout << endl;
	//算法 count 算法 用于统计元素的个数
	int n = count(pStart, pEnd,5);
	cout <<"n:"<< n << endl;
}
//STL 容器不单单可以存储基础数据类型,也可以存储类对象
class Teacher
{
public:
	Teacher(int age):age(age){};
	~Teacher(){};
public:
	int age;
};
void test02(){
	vector<Teacher> v;//存储 Teacher 类型数据的容器
	Teacher t1(10), t2(20), t3(30);
	v.push_back(t1);
	v.push_back(t2);
	v.push_back(t3);
	vector<Teacher>::iterator pStart = v.begin();
	vector<Teacher>::iterator pEnd = v.end();
	//通过迭代器遍历
	while(pStart != pEnd){
		cout << pStart->age <<" ";
		pStart++;
	}
	cout << endl;
}
//存储 Teacher 类型指针
void test03(){
	vector<Teacher*> v;//存储 Teacher 类型指针
	Teacher* t1 =new Teacher(10);
	Teacher* t2 =new Teacher(20);
	Teacher* t3 =new Teacher(30);
	v.push_back(t1);
	v.push_back(t2);
	v.push_back(t3);
	//拿到容器迭代器
	vector<Teacher*>::iterator pStart = v.begin();
	vector<Teacher*>::iterator pEnd = v.end();
	//通过迭代器遍历
	while(pStart != pEnd){
		cout <<(*pStart)->age <<" ";
		pStart++;
	}
	cout << endl;
}
//容器嵌套容器 难点(不理解,可以跳过)
void test04(){
	vector<vector<int>> v;//容器中存储容器
	vector<int> v1, v2, v3;
	v1.push_back(1);
	v1.push_back(2);
	v2.push_back(10);
	v3.push_back(100);
	v3.push_back(200);
	v.push_back(v1);
	v.push_back(v2);
	v.push_back(v3);
	//拿到容器迭代器
	vector<vector<int>>::iterator pStart = v.begin();
	vector<vector<int>>::iterator pEnd = v.end();
	//通过迭代器遍历
	while(pStart != pEnd){
		vector<int> vTemp =*pStart;//获得迭代器当前指向的容器
		vector<int>::iterator tmpStart = vTemp.begin();
		vector<int>::iterator tmpEnd = vTemp.end();
		for(; tmpStart != tmpEnd; tmpStart++){
			cout <<*tmpStart <<" ";
		}
		cout << endl;
		pStart++;
	}
}
int main(){
	//test01();
	//test02();
	//test03();
	test04();
	system("pause");
	return EXIT_SUCCESS;
}

标签:容器,头文件,迭代,STL,标准,算法,vector,模板
From: https://blog.csdn.net/2401_83614570/article/details/140522262

相关文章

  • [题解]P1452 【模板】旋转卡壳 | [USACO03FALL] Beauty Contest G
    P1452【模板】旋转卡壳|[USACO03FALL]BeautyContestG旋转卡壳模板题。凸包用的是Andrew算法,就不详述了,具体可以查查资料了解,但提一嘴Andrew算法的一些细节问题:Andrew算法的一些细节Andrew算法的模板代码如下:sort(a+1,a+1+n,cmp);st[++top]=1;for(inti=2;i<=n;i++){ ......
  • SpringBoot与Thymeleaf模板技术整合
    以下是一个简单的SpringBoot整合Thymeleaf的入门案例:1.创建一个SpringBoot项目,并添加Thymeleaf依赖。org.springframework.bootspring-boot-starter-thymeleaforg.springframework.bootspring-boot-starter-web2.在src/main/resources/templates目录下创建一个HTML模......
  • 易优CMS模板标签collect文档收藏
    [基础用法]标签:collect描述:文档收藏/取消标签用法:{eyou:collectid="collect"cancel="加入收藏"collect="已收藏"}<a{$collect.onclick}>{$collect.cancel}</a>收藏数:<span{$collect.numId}></span>次{$collect.hidden}{/eyou:c......
  • STM32寄存器操作、模板构建
    2024年7月18日发布于博客园,本文涉及到STM32F4XX和STM32F1XX系列目录外设寄存器查找①名称②偏移地址③寄存器位表④位功能说明寄存器基本操作C语言的置位和清零具体方法设置GPIO流程给寄存器赋值带参数宏STM32F1xx芯片识别存储器映射寄存器映射让GPIOB端口的16个引脚输......
  • 杭州外贸网站建设 最好用wordpress模板来搭建
    防护服wordpress外贸网站模板消防服、防尘服、隔热服、防化服、防静电服、电焊服wordpress外贸网站模板。https://www.jianzhanpress.com/?p=4116工业品wordpress外贸网站模板机械及行业设备、五金工具、安全防护、包装、钢铁、纺织皮革等工业品wordpress外贸网......
  • F1-score(标准度量)
    什么是F1-score?F1分数(F1-score)是分类问题的一个衡量指标。一些多分类问题的机器学习竞赛,常常将F1-score作为最终测评的方法。它是精确率和召回率的调和平均数,最大为1,最小为0,如公式1所示。公式1计算过程TP(TruePositive):预测答案正确FP(FalsePositive):错将其他类......
  • X.509、PKCS公钥密码学标准及常见RFC
    X.509:公钥证书的格式标准,应用于包括TLS/SSL在内的众多网络协议;PKCS:即PublicKeyCryptographyStandards-公钥密码学标准。是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的......
  • 2024-07-17 如何在vscode部署你的代码块,从而在新建页面时能快速搭建模板(windows环境)
    步骤一:打开vscode,按住ctrl+shif+p唤出命令窗口 步骤二:在窗口中输入命令,并回车Preferences:OpenUserSnippets 对,就是这个代码片段,接着输入你想添加代码的某某语言or脚本,比如我要添加vue的代码片段输入vue,回车,会显示vue.json文件出来给你更改,我的是这样 注意:如果你......
  • Goby漏洞发布 | CVE-2024-4879 ServiceNowUI /login.do Jelly模板注入漏洞【已复现】
    漏洞名称:ServiceNowUI/login.doJelly模板注入漏洞(CVE-2024-4879)EnglishName:ServiceNowUI/login.doInputValidationVulnerability(CVE-2024-4879)CVSScore:9.3漏洞描述:ServiceNow是一个业务转型平台。通过平台上的各个模块,ServiceNow可用于从人力资源和员工管理到自动......
  • 模板设计模式
    模板模式(TemplatePattern)是一种行为设计模式,它在一个方法中定义一个操作的骨架,而将一些步骤的实现延迟到子类中。模板方法模式使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。模板模式的组成部分抽象类(AbstractClass):定义算法的骨架,并包含一个模板方法。......