【C++知识点总结全系列 (06)】:STL六大组件详细介绍与总结(配置器、容器、迭代器、适配器、算法、仿函数)

news2024/10/5 13:08:36

STL六大组件目录

  • 前言
  • 1、配置器
    • (1)What
    • (2)Why
    • (3)How
      • A.调用new和delete实现内存分配与销毁
      • B.STL Allocator
    • (4)allocator类
      • A.What
      • B.How
      • C.allocator的算法
  • 2、容器
    • (1)What
    • (2)Which(有哪些容器)
    • (3)序列容器(顺序容器)
      • A.Which
      • B.array:存储固定长度元素的序列
      • C.deque队列
      • D.forward_list
  • 3、迭代器
  • 4、算法
  • 5、仿函数
  • 6、适配器

前言

在这里插入图片描述
仿函数提供了一种调用算法的方式、算法通过迭代器对容器里边的数据进行访问和处理、迭代器是访问容器中数据的重要方式、而容器所占有的内存空间是由配置器分配和管理的。此外,适配器是对容器、迭代器或仿函数的一个封装。

1、配置器

(1)What

负责空间配置与管理,从实现角度来看,配置器是一个实现了动态空间配置、空间管 理、空间释放的类模板

(2)Why

动态内存管理(内存分配、对象构造、对象析构、内存释放、内存重新分配等)

(3)How

A.调用new和delete实现内存分配与销毁

在这里插入图片描述

B.STL Allocator

对象的构造由allocator类的construct负责,对象的释放由destroy负责
内存配置由allocate()负责,内存释放由deallocate()负责

(4)allocator类

A.What

C++11中预定义的配置器类,用于管理容器的内存分配是释放

B.How

allocator类的使用主要关注它的四个成员函数:

  • 分配内存:allocate()
  • 构造对象:construct(),在分配好的内存中构造对象
  • 销毁对象:destroy(),回收已分配的内存空间,释放数据对象
  • 回收内存:deallocate(),将内存空间归还给操作系统
//分配 10 个 string 类型的对象的内存(未初始化) 
std::allocator<string> alloca;
auto const p=alloca.allocate(10); //分配未构造的内存
alloca.construct(p,"zhangsan"); 
auto q=p;
alloca.construct(++q,"lisi"); 
alloca.construct(++q,"wangwu"); 
cout<<(*q)<<endl; //打印:wangwu
//使用完对象后,必须对每个构造的元素调用 destroy 类销毁它们 
while(q!=p)
{ 
	alloca.destroy(--q); 
}
//元素被销毁之后,可以重新使用 alloca,也可以归还给系统 
alloca.deallocate(p,10);

C.allocator的算法

在这里插入图片描述

//拷贝和填充未初始化内存的算法:在未初始化的内存中创建对象 
std::vector<int> vec_a{1,2,3,4,5};
std::allocator<int> alloca_int; 
int* p_int=alloca_int.allocate(vec_a.size()*2);//p_int 为 int 类型的指针
//拷贝元素到 alloca_int 的内存中去
std::uninitialized_copy(vec_a.begin(),vec_a.end(),p_int);
for(int i=0;i<vec_a.size();++i){cout<<*(p_int+i)<<" ";}cout<<endl;//打印:1 2 3 4 5
//将剩余的元素初始化为 100
std::uninitialized_fill_n(p_int,vec_a.size(),100);
for(int i=0;i<vec_a.size();++i){cout<<*(p_int+i)<<" ";}cout<<endl;//打印:100 100 100 100 100

2、容器

(1)What

本质是标准库中特定用于存储和管理数据的类模板

(2)Which(有哪些容器)

在这里插入图片描述

  • 序列容器(顺序容器):容器中的数据是有序的
  • 关联容器:通过键值对(key-valuepair)来组织和访问元素,将红黑树作为底层数据结构,用于维护 键值对集合,并提供高效的元素访问和操作能力,本质是类模板

(3)序列容器(顺序容器)

A.Which

array、deque、forwarrd_list、list、vector

B.array:存储固定长度元素的序列

非成员函数

  • get(array):

template <int Index, class T, size_t N> constexpr T& get(array<T,N>&arr> noexcept;

std::array<int,4> c0{0,1,2,3}; //创建并初始化一个array类对象c0
for(const int &iTmp:c0)
{
	cout<<" "<<iTmp;
}
int i1 = std::get<1>(c0); // 得到1
int i3 = std::get<3>(c0); // 得到3
  • swap(array01, array02):

template<class T, std::size_t N>
void swap(array<T, N>&arr01, array<T,N> &arr01);

//成员函数
arr01.swap(arr02);
//非成员函数
swap(arr01, arr02);
  • 其它非成员函数:
    在这里插入图片描述
    成员函数
成员函数说明
array()构造函数
at()返回指定位置的引用
font() / back()返回第一个元素 (最后一个)元素的引用
begin() / end()返回第一个(最后一个)元素的迭代器
cbegin() / cend()返回第一个(最后一个)元素的常量迭代器
rbegin() / rend()返回反向数据中第一个(最后一个)元素的迭代器
data()返回第一个元素的地址
empty()测试array对象中是否存在数据
fill()将所有元素替换为指定值
assign()同fill
size()返回array对象中元素的个数
swap()交换两个array对象的数据

C.deque队列

非成员函数:

  • swap(q01,q02):交换两个队列数据

成员函数:

成员函数说明
at()返回指定位置的引用
font() / back()返回第一个元素 (最后一个)元素的引用
begin() / end()返回第一个(最后一个)元素的迭代器
cbegin() / cend()返回第一个(最后一个)元素的常量迭代器
rbegin() / rend()返回反向数据中第一个(最后一个)元素的迭代器
data()返回第一个元素的地址
empty()测试容器中是否存在数据
fill()将所有元素替换为指定值
assign()同fill
size()返回array对象中元素的个数
swap()交换两个容器的数据
emplace()就地构造元素插入到deque指定位置
emplace_back() / emplace_front()就地构造元素插入到末尾(开头)
erase()从指定位置删除一个或多个元素
insert()在指定位置插入一个或多个元素
pop_back() / pop_front()清除deque末尾(开头)元素
push_back() / push_front()添加元素到末尾(开头)
resize()为deque指定新的大小

D.forward_list

3、迭代器

4、算法

5、仿函数

6、适配器

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

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

相关文章

Unreal Engine@Jetson Orin Nano尚不支持

Unreal EngineJetson Orin Nano尚不支持 1. 源由2. Unreal Engine介绍3. 问题4. 编译方法5. 补充 1. 源由 最近在看SC-Explorer方面的内容&#xff0c;在模拟方面采用了Unreal Engine。 本打算跑下模拟&#xff0c;因此打算在JetsonOrin的板子上试试看。 2. Unreal Engine介绍…

【Python】已解决:urllib.error.HTTPError: HTTP Error 403: Forbidden

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;urllib.error.HTTPError: HTTP Error 403: Forbidden 一、分析问题背景 在使用Python的urllib库中的urlopen或urlretrieve函数下载文件时&#xff0c;有时会遇到…

SAP 物料状态简介

在物料主数据中有个物料状态的栏位&#xff0c;这个栏位的作用就在于对涉及到相应物料主数据的各种事务进行不同形式的限制&#xff0c;从而达到对物料的用途进行管控的作用。在实际业务中&#xff0c;尤其是涉及到物料的生命周期管理时&#xff0c;当某个物料已经被禁用的时候…

报表-显示图片(logo、签名、签章等)

1、数据源 字段里面存图片url或base64 比如&#xff1a;https://img2.baidu.com/it/u99450198,2193994199&fm253 as img1 或data:image/png;base64&#xff0c;因为base64体积大&#xff0c;适用于图片尺寸小&#xff0c;并且数量小的情况 2、报表设计 使用ShowImage方…

【创建者模式-建造者模式】

概要 将一个复杂对象的构建与表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 建造者模式包含以下角色 抽象建造者类&#xff08;Builder&#xff09;&#xff1a;这个接口规定要实现复杂对象的那些部分的创建&#xff0c;并不涉及具体的部件对象的创建。具体建…

C++获取数组长度以及数组的函数传参获取数组长度

1、C获取数组长度----sizeof(array)/sizeof(array[0]) 定义一个数组&#xff0c;int arr[]{1,2,3,4,5,6,7,8,9}; sizeof&#xff08;&#xff09;方法用于统计变量的内存大小&#xff0c;sizeof&#xff08;arr&#xff09;用于获取数组arr占用的内存大小 sizeof&#xff08…

罗德和神牛、西圣无线麦克风哪个好用?罗德、西圣多方位实测对比

随着短视频行业的兴起&#xff0c;越来越多人开始加入自媒体创作的行业中&#xff0c;不过对于短视频而言&#xff0c;光有好的画面是不够的&#xff0c;还需要清晰、干净的声音。而无线领夹麦适用于唱歌、直播、吃播、短视频、访谈等场景使用&#xff0c;而且能够极大的提高声…

交通气象站:保障道路畅通的守护者

随着现代社会的飞速发展&#xff0c;交通网络日益密集&#xff0c;人们的出行越来越依赖于公路、铁路和航空等交通方式。然而&#xff0c;多变的天气条件常常给交通安全带来隐患&#xff0c;如大雾、雨雪、强风等恶劣天气不仅影响行车视线&#xff0c;还可能造成路面湿滑、结冰…

计算机硬件(考点篇)试题

波特率&#xff1a; 在电子通信领域&#xff0c;波特&#xff08;Baud&#xff09;即调制速率&#xff0c;指的是有效数据讯号调制载波的速率&#xff0c;即单位时间内载波调制状态变化的次数。波特&#xff08;Baud&#xff0c;单位符号&#xff1a;Bd&#xff09;。 波特率…

78.Vue 3 重用性模态框组件

模态框是大多数 Web 应用程序中的基本构建块。虽然最初实现起来可能看起来有点棘手&#xff0c;但实际上&#xff0c;使用 Vue 和一些 Flexbox 技巧&#xff0c;这不仅可行&#xff0c;而且非常简单。 让我们一起实现一个基础的模态框组件。 架构如下&#xff1a; AppModal.vue…

【OceanBase】OBProxy 无状态的理解

SueWakeup 个人主页&#xff1a;SueWakeup 系列专栏&#xff1a;为祖国的科技进步添砖Java 个性签名&#xff1a;保留赤子之心也许是种幸运吧 本文封面由 凯楠&#x1f4f8;友情提供 目录 前言 OBProxy 无状态的概述 OBProxy 无状态特性带来的优点 1. 高可用 2. 负载均衡…

当Matplotlib遇见SciencePlots

分享一个Matplotlib扩展工具SciencePlots&#xff0c;一行代码绘制science、nature、ieee等要求的图形。 安装 安装SciencePlots # 直接从PyPI安装 pip install SciencePlots 安装latex 如果latex未安装&#xff0c;会报错&#xff1a;RuntimeError: Failed to process st…

尚硅谷k8s 2

p54-56 k8s核心实战 service服务发现 Service:将一组 Pods 公开为网络服务的抽象方法。 #暴露Deploy,暴露deploy会出现在svc kubectl expose deployment my-dep --port8000 --target-port80#使用标签检索Pod kubectl get pod -l appmy-depapiVersion: v1 kind: Service metad…

简易电阻、电容和电感测量仪-FPGA

通过VHDL语言编写程序用于设计电阻、电容和电感测量仪&#xff0c;通过使用试验箱进行验证是否设计正确&#xff0c;资料获取到咸&#x1f41f;&#xff1a;xy591215295250 \\\或者联系wechat 号&#xff1a;comprehensivable 设计并制作--台数字显示的电阻、电容和电感参数测试…

【技术杂谈】如何访问Github | 解决无法连接Github的问题

访问网页的过程 什么是域名&#xff1f;什么是IP地址&#xff1f;- 域名是网站的名称。 - IP地址是服务器在互联网上的逻辑地址。域名往往是固定的&#xff0c;但是IP地址很有可能是会改变的。计算机通过Host文件检查本地缓存是否有域名对应IP地址 Host文件路径 C:\Windows\Sy…

使用API有效率地管理Dynadot域名,为文件夹中的域名设置域名隐形转发

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

爬虫cookie是什么意思

“爬虫 cookie”指的是网络爬虫在访问网站时所使用的cookie&#xff0c;网络爬虫是一种自动化程序&#xff0c;用于在互联网上收集信息并进行索引&#xff0c;这些信息可以用于搜索引擎、数据分析或其他目的。 本教程操作系统&#xff1a;Windows10系统、Dell G3电脑。 “爬虫…

JAVA-Redis数据结构—跳跃表(Skiplist)【包含Java实现详情代码】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

掌握智慧校园:资产来源功能解析

在智慧校园的资产管理框架下&#xff0c;资产来源管理是确保资产数据完整性和合规性的重要一环。这一功能通过数字化手段&#xff0c;详尽记录每一项资产从何而来&#xff0c;无论是采购、捐赠、内部调拨&#xff0c;还是自制与改造&#xff0c;均需经过严格记录与追踪&#xf…

vite+vue集成cesium

1、创建项目、选择框架vuejs pnpm create vite demo_cesium 2、进入项目安装依赖 cd demo_cesium pnpm install3、安装cesium及插件 3、pnpm i cesium vite-plugin-cesium 4、修改vite-config.js import { defineConfig } from vite import vue from vitejs/plugin-vue impo…