C++STL_01_STL基础和概述

STL基础和概述

  STL(standard template library):本质是一种标准模板库(泛型库),是为节省代码量封装起来的通用库。
    只是STL里面几乎全部都是基础模板函数和模板类,属于C++,不需要额外安装

  STL 最初由惠普实验室开发,
    于 1998 年被定为国际标准,正式成为 C++ 程序库的重要组成部分
    如今 STL 已完全被内置到支持 C++ 的编译器中,无需额外安装,致使STL 被广泛使用。
    STL 位于C++ 的头文件中,以源代码的形式提供。

  STL最大的作用就是:STL 基本上达到了各种存储方法和相关算法的高度优化。
              基本考虑到了众多代码细节实现的方法,便于宏观编写代码

 

  广义上STL:容器、算法、迭代器。
  STL六大组件:容器、算法、迭代器、仿函数(函数对象)、适配器、空间适配器(内存分配器)

 

  容器:就是专门用来存放数据的,封装了一些数据结构模板类;(数组、链表、队列、栈等等)
      (vector 向量容器(可变长度数组)、list 列表容器(链表) deque双端队列容器等 )

  算法(algorithm):对容器中的数据进行处理和操作,封装了一些数据结构算法设计成模板函数;
               质变算法:对容器中原本的数据有影响。(拷贝、增删改)
          非质变算法:对容器中原本的数据没有影响。(遍历、查找)

      在 std 命名空间定义,大部分在<algorithm> 中,少部分在 <numeric> 中。

  迭代器:完成对容器中数据的读写操作,作为容器(数据)和算法(方法)之间的粘合剂。称为泛型指针

  仿函数:行为类似函数,是一种重载了operator()的class,一般的函数指针可以视为狭义的仿函数

  适配器:使一个类的接口(模板的参数)适配成用户指定的形式,让原本不能一起的两个类一起工作。
      (容器、迭代器、算法都有适配器)

  内存分配器:为容器类模板提供自定义内存申请和释放功能,负责空间适配和管理
      (高级用户才有需求,一般用户不怎么使用的到)

 

  C++ STL头文件

<iterator> <memory> <vector> <stack> <list> <queue> <set>
<functional> <algorithm> <deque> <utility> <map> <numeric>  

 



按照 C++ 标准库的规定,所有标准头文件都不再有扩展名。即标准头文件不使用".h"
             但是为了向下兼容,某些STL版本同时存储具备扩展名和无扩展名的两种文件
             甚至某些文件可能会有三种文件!

  

容器

  容器:就是一些模板类的集合,容器中封装的模板类描述的是组织数据(数据结构)
  容器主要分两大类:1、序列式容器;(序列容器)
           2、关联式容器;(排序容器、哈希容器)
  序列容器:元素排列按位置顺序排列,与元素值大小无关
        (vector向量容器、list列表容器、deque双端队列容器)
  关联容器:元素排列按元素大小(默认从小到大)或者哈希函数序列排列,与位置顺序无关
        (set集合容器、multiset多重集合容器、map映射容器、multimap多重映射容器)
        (unordered_set哈希集合、unordered_multiset哈希多重集合)
        (unordered_map 哈希映射、 unordered_multimap 哈希多重映射)

 

算法

  算法:就是问题的解法,以有限的步骤解决问题的方法

  其实我们写的代码、函数、类都可以称作算法,只不过这些“算法”不具备复用性;
     只有那些经过反复验证和推理的通用性解决问题的方法,才被人们真正广为流传称为算法!
        包括查找、排序、增删改查等!

 

迭代器

  迭代器:就是调节和匹配容器和算法之间的润滑剂。
      (对外隐藏容器内部数据的差异,提供给算法统一的接口;对内具体执行数据的读写操作)
    1、不同容器意味着数据结构不同,自然操作数据的迭代器也会不同;
    2、容器对应的迭代器功能强弱直接决定对STL中的算法支持程度;
    3、迭代器和C++指针非常相似,可以完成常规指针的所有操作,可以具体指向容器内某个元素;
    4、迭代器是一个变量,*迭代器名就表示迭代器指向的元素。
  常用的迭代器按功能强弱主要分为:
    ①输入迭代器;②输出迭代器;③前向迭代器;④双向迭代器;⑤随机访问迭代器。
    输入迭代器:迭代器指向某个输入流,可以用输入迭代器进行程序的输入;
   istream_iterator<int,char>第一参数指出要读取的数据类型,第二参数指出输入流要使用的数据类型

    输出迭代器:迭代器指向某个输出流,可以用输出迭代器进行程序的输出;
   ostream_iterator<int,char>第一参数指出送到输出流的数据类型,第二参数表示输出流的数据类型

    前向迭代器:支持++p、p++、*p等正向移动(从前往后),两个正向迭代器可相互赋值和比较;
    双向迭代器:支持++平、--p、p++、p--、*p正反双向的移动(前向迭代器、反向迭代器);
    随机访问迭代器:具备双向迭代器的全部功能,并且p是一个随机访问迭代量。

    例子:vector<int> v;   //定义一个vector容器对象v,v存放的是一个可变长度的数组;
          vector<int>::iterator i;   //定义正向迭代器i
       vector<int>::reverse_iterator j;   //定义反向向迭代器j

 

仿函数

  仿函数也叫函数对象!仿函数是早期的叫法,现在也称作为函数对象。
    是一种可以像函数一样被调用的对象,因此称为仿函数或者函数对象都比较贴切!

 

 

 

适配器

  适配器:也叫配接器,扮演着转换器的作用

 

 

空间适配器

 





 

posted @   尘落曦枫  阅读(78)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示