【C++ STL】简述

文章目录

  • 【 1. 容器 】
  • 【 2. 迭代器 】
  • 【 3. 适配器 】

  • C++ 的 STL( 全称是 Standard Template Library 标准模板库,也叫 泛型库)是一套功能强大的 C++ 模板类,提供了 通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。
  • STL的分类
    • 标准函数库: 这个库是由通用的、独立的、不属于任何类的函数组成的。这个函数库继承自 C 语言,C++ 标准库包含了所有的 C 标准库,为了支持类型安全,做了一定的添加和修改。
      • 输入/输出 I/O
      • 字符串和字符处理
      • 数学
      • 时间、日期和本地化
      • 动态分配
      • 其他
      • 宽字符函数
    • 面向对象类库: 这个库是类及其相关函数的集合。标准的 C++ 面向对象类库定义了大量支持一些常见操作的类,比如输入/输出 I/O、字符串处理、数值处理。面向对象类库包含以下内容:
      • 标准的 C++ I/O 类
      • String 类
      • 数值类
      • STL 容器类
      • STL 算法
      • STL 函数对象
      • STL 迭代器
      • STL 分配器
      • 本地化库
      • 异常处理类
      • 杂项支持库
  • C++ 标准模板库包括以下 6 个组件(核心是前三个组件),每个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务:
组件描述
容器
(Containers)
容器是用来 管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 list链表、stack栈、queue队列、vector向量、deque双向队列 等。
迭代器
(iterators)
迭代器用于 遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。
算法
(Algorithms)
算法作用于容器,它们提供了 各种通用算法 。包括对容器内容执行初始化、排序、搜索和转换等操作。
仿函数
(Functor)
如果一个类将 () 运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象(又称仿函数)
适配器
(Adaptor)
可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器;
分配器
(allocator)
为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。

【 1. 容器 】

  • 容器就是一些模板类的集合,但和普通模板类不同的是, 容器中封装的是组织数据的方法(也就是数据结构)
  • 序列式容器
    包括 array、vector、list、deque 和 forward_list,其存储的都是 C++ 基本数据类型(诸如 int、double、float、string 等)或使用结构体自定义类型的元素。
  • 关联式容器
    关联式容器在存储元素值的同时,还会 为各元素额外再配备一个值,又称为 ,其本质也是一个 C++ 基础数据类型或自定义类型的元素。它的功能是在使用关联式容器的过程中,如果 已知目标元素的键的值,则直接通过该键就可以找到目标元素,而无需再通过遍历整个容器的方式。
  • STL 容器种类和功能
    排序容器和哈希容器有时也称为 关联容器
容器种类功能举例
序列容器序列容器 中的 元素在容器中的位置同元素的值无关,即容器不是排序的。将元素插入容器时,指定在什么位置,元素就会位于什么位置。主要包括 vector 向量容器、list 列表容器以及 deque 双端队列容器。
排序容器
(有序关联式容器)
排序容器 中的 元素默认是由小到大排序好的,即便是插入元素,元素也会插入到适当位置。所以关联容器在查找时具有非常好的性能。包括 set 集合容器、multiset多重集合容器、map映射容器以及 multimap 多重映射容器。
哈希容器
(无序关联式容器)
哈希容器 中的 元素是未排序的,元素的位置由哈希函数确定C++ 11 新加入 4 种关联式容器,分别是 unordered_set 哈希集合、unordered_multiset 哈希多重集合、unordered_map 哈希映射以及 unordered_multimap 哈希多重映射。

【 2. 迭代器 】

  • 简单来讲,迭代器和 C++ 的指针非常类似,它可以是需要的任意类型,通过迭代器可以指向容器中的某个元素,如果需要,还可以对该元素进行读/写操作。
  • 详见:【C++ STL迭代器】iterator

【 3. 适配器 】

  • 我们所说的这个“适配器”,和生活中常见的电源适配器中“适配器”的含义非常接近。我们知道,无论是电脑、手机还是其它电器,充电时都无法直接使用 220V 的交流电,为了方便用户使用,各个电器厂商都会提供一个适用于自己产品的电源线,它可以将 220V 的交流电转换成适合电器使用的低压直流电。
    从用户的角度看,电源线扮演的角色就是将原本不适用的交流电变得适用,因此其又被称为电源适配器。
  • 再举一个例子,假设一个代码模块 A,它的构成如下所示:
class A{
public:void f1(){}void f2(){}void f3(){}void f4(){}
};
  • 现在我们需要设计一个模板 B,但发现,其实只需要组合一下模块 A 中的 f1()、f2()、f3(),就可以实现模板 B 需要的功能。其中 f1() 单独使用即可,而 f2() 和 f3() 需要组合起来使用,如下所示:
class B
{
private:A * a;
public:void g1(){a->f1();}void g2(){a->f2();a->f3();}
};
  • 可以看到,就如同是电源适配器将不适用的交流电变得适用一样,模板 B 将不适合直接拿来用的模板 A 变得适用了,因此我们可以 将模板 B 称为 B 适配器
  • 容器适配器也是同样的道理,简单的理解 容器适配器,其就是 将不适用的序列式容器(包括 vector、deque 和 list)变得适用。容器适配器的底层实现和模板 A、B 的关系是完全相同的,即通过封装某个序列式容器,并重新组合该容器中包含的成员函数,使其满足某些特定场景的需要。
  • 容器适配器本质上还是容器,只不过此容器模板类的实现,利用了大量其它基础容器模板类中已经写好的成员函数。当然,如果必要的话,容器适配器中也可以自创新的成员函数。
  • 需要注意的是,STL 中的 容器适配器内部使用的基础容器并不是固定的,用户可以在满足特定条件的多个基础容器中自由选择。
  • STL 提供了 3 种容器适配器,分别为 stack 栈适配器、queue 队列适配器以及 priority_queue 优先权队列适配器。其中,各适配器所使用的默认基础容器以及可供用户选择的基础容器,如表 所示。
容器适配器基础容器筛选条件
基础容器需包含以下成员函数:
满足条件的基础容器默认使用的基础容器
stackempty()
size()
back()
push_back()
pop_back()
vector、deque、list。deque
queueempty()
size()
front()
back()
push_back()
pop_front()
deque、list。deque
priority_queueempty()
size()
front()
push_back()
pop_back()
vector、deque。vector
  • 不同场景下,由于不同的序列式容器其底层采用的数据结构不同,因此容器适配器的执行效率也不尽相同。但通常情况下,使用默认的基础容器即可。当然,我们也可以手动修改,具体的修改容器适配器基础容器的方法,后续讲解具体的容器适配器会详细介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/796992.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring之AOP(面向切面编程)之详结

AOP面向切面编程,一种编程范式,指导开发者如何组织程序结构 作用: 在不惊动原始设计的基础上为其进行功能增强 核心概念 代理:SpringAOP的核心本质是采用代理模式实现的连接点:程序执行过程中的任意位置&#xff0…

Python项目21:一个简单的记账系统(收入+支出+查询)

------------★Python练手项目源码★------------ Python项目源码20:银行管理系统(开户、查询、取款、存款、转账、锁定、解锁、退出) Python项目19:学员信息管理系统(简易版) Python项目18:…

【Linux-运维】查看操作系统的指定端口占用情况确定端口是哪个服务占用

不同的查看端口占用的方法,应用场景有所不同 一、查询某个端口是否被占用?lsof -i:端口号lsof -i:协议 查看某个协议的占用情况netstat -tlnp|grep 端口号ss -tlnp|grep 端口号fuser 端口号/协议ls -l /proc/$(lsof -t -i:端口号)|grep exe 二、确认指定…

统计天数C++

1.统计天数 问题描述 给定两个年份 n*,*m,问,两个年份之间有多少天(包括年份 n 和年份 m)? 输入格式 第一行包含两个整数 n*,m,含义与问题描述中相同。 输出格式 输出共一行,包含一个整数…

Android14系统go版添加微件功能

一般normal版软件自带微件功能,但是go版没有这个功能,但是客户有时会要求也要加上这个微件功能,实现的方法修改如下: 1. frameworks/base diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index…

docker compose部署项目—踩坑记录

问题1:创建容器设置的mysql 的密码未生效 创建容器用 MYSQL_ROOT_PASSWORD配置了密码,但是密码没生效,还是原来的密码。 mysql:image: mysql:8.0container_name: mysql_testports:- "3306:3306"environment:TZ: Asia/ShanghaiMYSQ…

C++ 【原型模式】

简单介绍 原型模式是一种创建型设计模式 | 它使你能够复制已有对象,客户端不需要知道要复制的对象是哪个类的实例,只需通过原型工厂获取该对象的副本。 以后需要更改具体的类或添加新的原型类,客户端代码无需改变,只需修改原型工…

JS第九天

今天是第九天,学习了JS中的设置日期和倒计时,计时器以及验证码倒计时,那么话不多说我们开始今天的学习吧 一、日期设置 1.1日期创建 调用 new Date() 来创建一个新的 Date 对象。在调用时可以带有一些参数,创建一个 Date 对象&…

[ 云计算 | AWS ] ChatGPT 竞争对手 Claude 3 上线亚马逊云,实测表现超预期

文章目录 一、前言二、Claude 3 介绍以及相关测试细节三、在亚马逊云科技上体验 Claude 33.1 在 Amazon Bedrock 服务中配置 Claude 33.2 为聊天配置使用 Claude 3 模型3.3 Caude 3 Sonet 聊天体验 四、文末总结五、参考文献 一、前言 3月4号,Anthropic 发布了号称…

第十四届蓝桥杯C/C++大学B组题解(一)

1、日期统计 #include <bits/stdc.h> using namespace std; int main() {int array[100] {5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7,5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9,2, 7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6,…

鸿蒙Lottie动画-实现控制动画的播放、暂停、倍速播放、播放顺序

介绍 本示例展示了lottie对动画的操作功能。引入Lottie模块&#xff0c;实现控制动画的播放、暂停、倍速播放、播放顺序、播放到指定帧停止或从指定帧开始播放、侦听事件等功能&#xff0c;动画资源路径必须是json格式。 效果预览 使用说明&#xff1a; 进入页面默认开始201…

Python人工智能应用---中文分词词频统计

目录 1.中文分词 2.循环分别处理列表 &#xff08;1&#xff09;分析 &#xff08;2&#xff09;代码解决 3.词袋模型的构建 &#xff08;1&#xff09;分析需求 &#xff08;2&#xff09;处理分析 1.先实现字符串的连接 2.字符串放到新的列表里面 4.提取高频词语 &…

一些好玩的东西

这里写目录标题 递归1.递归打印数组和链表?代码实现原理讲解二叉树的 前 中 后 序位置 参考文章 递归 1.递归打印数组和链表? 平常我们打印数组和链表都是 迭代 就好了今天学到一个新思路–>不仅可以轻松正着打印数组和链表 , 还能轻松倒着打印(用的是二叉树的前中后序遍…

Linux基础篇:Linux第三方软件仓库——可以让Linux变得有趣的软件仓库

Linux第三方软件仓库——可以让Linux变得有趣的软件仓库 一、epel源介绍 EPEL&#xff08;Extra Packages for Enterprise Linux&#xff09;源是一个由Fedora项目组维护的第三方软件仓库&#xff0c;为企业级Linux发行版&#xff08;如Red Hat Enterprise Linux&#xff08;…

清明作业 c++

1.封装一个类&#xff0c;实现对一个数求累和阶乘质数 #include <iostream>using namespace std; int mproduct(int a){if(a>1){return a*mproduct((a-1));}else{return 1;} } class number{int a; public:number():a(5){};number(int a):a(a){}void set(int a){thi…

c#编程基础学习之数组

目录 数组排序数组System.Linq 命名空间其他创建数组的方法 数组 数组用于在单个变量中存储多个值&#xff1b; 声明数组需定义带方括号[]的变量类型&#xff1b; string[] cars {"MARRY", "BOB", "Far", "Aada"}; //字符串数组 in…

ChatGLM-6B实战微调(P-tuning-v2、LORA)

硬件准备 GPU: NVIDIA Tesla A30 24GB python 3.10 pytorch 1.11 transformers 4.27.1 实验环境 Change your pip source pip config set global.extra-index-url https://pypi.tuna.tsinghua.edu.cn/simple # Writing to /opt/conda/pip.conf pip config set global.inde…

【嵌入式学习】FreeRTOS day04.05

练习 1.总结二进制信号量和计数型信号量的区别&#xff0c;以及他们的使用场景。 二进制信号量&#xff1a;信号量的数值只有0和1&#xff08;用于共享资源的访问&#xff09; 计数性信号量&#xff1a;计数型信号量的值一般是大于或者等于2&#xff08;生产者和消费者模型&am…

软件设计原则:开闭原则

定义 开闭原则&#xff08;Open-Closed Principle, OCP&#xff09;是面向对象设计的基本原则之一&#xff0c;由 Bertrand Meyer 提出。它指出软件实体&#xff08;类、模块、函数等&#xff09;应该对扩展开放&#xff0c;对修改封闭。这意味着软件应该设计成在不修改现有代…

如何从vue项目界面上看出来node.js版本

一&#xff1a; 要从 Vue 项目界面上看出当前使用的 Node.js 版本&#xff0c;你可以通过以下几种方式进行查看&#xff1a; 开发者工具&#xff1a;在浏览器中打开 Vue 项目&#xff0c;并打开开发者工具&#xff08;一般是按下 F12 键&#xff09;。在开发者工具的控制台选项…