当前位置: 首页 > news >正文

C++STL系列之概述


前言

这部分其实早就学完了,抽出来时间准备复习一下STL,C++中STL的重要性不言而喻,是C++中的一个重要组成部分,本次内容是对其的一个概述,之后会具体讲解。


一、什么是STL

STL – 标准模板库(standard template library),涵盖了数据结构和算法,充分体现了C++是一门面向对象的语言,以前在C语言需要自己造轮子,现在使用STL可以更加简单,也隐藏了内部的实现。STL的版本较多,当前主流的版本比如libstdc++,MSVC STL等等,目前Linux系统下使用最为广泛的版本是libstdc++,该版本以 SGI STL 为基础发展而来,参考源代码可以参考这个版本。

二、六大组件

比较重要的有三个:算法 迭代器 容器
其余三个:仿函数,空间配置器,适配器。
具体是什么,这里会进行简单的讲解,后面进一步的学习会更加深刻。

1.容器

字面意思,容纳元素的器件,比如vector,string,list,map,set等都是容器,容器大体可分为两类:1.序列式容器,此类容器内部的存储顺序一般是按插入顺序来的,没有规则,比如vector,string,list。2. 关联式容器,此类容器按照一定的规则排序,比如map,set按key来排序。

2.算法

字面意思,包含在头文件< algorithm >中提供了多种多方面的函数,排序,去重,挑选,查找,最大最小,堆操作等等,注意使用条件,比如sort内部要传随机迭代器,因为底层是快排,需要作+ 或者 - 。

3.!!!!!迭代器!!!!!

最重要的一个部分,迭代器是容器和算法之间的桥梁,它的作用类似于指针,能够让我们不依赖于具体容器类型去遍历容器中的元素。迭代器为各种容器提供了统一的访问接口,极大地增强了代码的通用性和灵活性。
容器中的迭代器一般支持三种操作:
1.解引用,*it拿到当前元素的值(->)
2.递增,++走到下一个迭代器的位置
3.比较 通过是否到end()来判断是否遍历完容器
大致分为六类:
在这里插入图片描述
这个表格是非常完美的表格,充分体现了这五种迭代器的关系(第六类后面提)
容器里面的迭代器一般只需要记住三类,Forward iterator 和 Bidirectional iterator和 Random iterator。他们都继承了input和output迭代器,所以如果这个算法需要input迭代器,子类也可以使用(继承的知识点),这三个的区别其实看图可以看个大概,最重要的:
1.单向 双向 和 随机 单向支持++,双向支持++和- -,随机支持++ - - + -
单向:比如单链表forward_list,哈希表unordered系列
双向:list set map
随机:vector deque
具体介绍每一个容器的模拟会使用迭代器,也会加强理解。

第六类是C++20提出的Contiguous Iterator,连续迭代器,就是随机迭代器的基础上还要求内存上是连续的,比如vector。
最重要的还是单向双向和随机要理解好。

遍历容器的基本方式:其中Container表示具体容器名字。

auto it = Container.begin();
while (it != Container.end())
{cout << *it << endl;++it;
}

4.空间配置器

就是一个内存池,给你提供空间,一直在用,但是不知道在用
比如vector< int > v(10,0); 就new了十个空间,内存池为你提供了空间,不用过多了解,也接触不到底层。

5.仿函数

像函数一样的类,具体在优先级队列会进行具体的讲解,虽然lambda的出现用的也很香。先记住写法,后面讲使用

//比如调用函数 func(1),仿函数就是看着像函数实际是类,需要重载operator()
struct Less{bool operator()(int a,int b){return a < b;}
};

6.适配器

适配器可以理解为对现有资源的复用,比如C手搓stack和queue的时候,可以使用链表结构或者顺序表结构,C++中的实现就可以复用vector和list和deque(库里默认是deque,后面讲),所以stack和queue不是容器!!!!

三、缺陷

STL还是存在的一定的缺陷的,1.冗余问题,array,string的size 和 length,单链表等等。2.STL没有支持线程安全!现在也没有,这是个很大的问题,需要手动上锁。

总结

之后会进行容器string等等一系列的讲解,对于底层会额外出数据结构的讲解,(本假期应该是搜索树系列),正好开学要学数据结构,那些C手搓的就上课再去更新。

http://www.lryc.cn/news/593187.html

相关文章:

  • OpenCV 官翻5 - 机器学习
  • 【web安全】万能密码
  • 物联网系统中的可视化大屏定义
  • UGUI 性能优化系列:第三篇——渲染与像素填充率优化
  • 小明记账簿焕新记:从单色到多彩的主题进化之路
  • 【Android】ListView与RecyclerView的基础使用
  • 安全隔离新选择:SiLM5768L系列 - 集成互锁功能的高速六通道数字隔离器
  • 从随机数值到特征检测器的学习与更新
  • 【Linux驱动-快速回顾】简单了解一下PinCtrl子系统:设备树如何被接解析与匹配
  • 大模型 Function Call 的实现步骤及示例详解
  • SpringBoot 3.0 挥别 spring.factories,拥抱云原生新纪元
  • Java机考题:815. 公交路线 图论BFS
  • 猎板:在 5G 与 AI 时代,印制线路板如何满足高性能需求
  • SQL Server和PostgreSQL填充因子
  • 数据结构与算法之美:拓扑排序
  • 小谈相机的学习过程
  • ROS2 通过相机确定物品坐标位置
  • MySQL数据丢失救援办法
  • 异步解决一切问题 |消息队列 |减少嵌套 |hadoop |rabbitmq |postsql
  • 智能体之变:深度解析OpenAI ChatGPT Agent如何重塑人机协作的未来
  • 【Qt开发】Qt的背景介绍(三)-> 认识Qt Creator
  • 论文略读:Are Large Language Models In-Context Graph Learners?
  • 高可用架构设计与实践综述
  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 基于wordcloud库实现词云图
  • 暑假训练七
  • 进阶向:基于Python的智能客服系统设计与实现
  • 安装单机版本Redis
  • 13.4 Meta LLaMA开源模型家族全面解析:从Alpaca到Vicuna的技术内幕
  • Ubuntu 22.04.3 LTS 安装 MySQL
  • Gitee 提交信息的规范