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

C++(初阶)(十)——vector模拟实现

vector

  • vector
      • 构造
      • 尾插(删)和扩容
      • inert(插入)
      • 迭代器失效
      • erase(删除)
      • resize(调整空间)
      • 深浅拷贝
      • 迭代器
      • 拷贝和赋值(v2(v1)和v1 = v3)
      • 多个数据插入
      • 迭代器区间初始化

(constructor)构造函数声明接口说明
vector()(重点)无参构造
vector(size_type n, const value_type& val =value_type())构造并初始化n个val
vector (const vector& x); (重点)拷贝构造
vector (InputIterator first, InputIterator last);使用迭代器进行初始化构

构造

namespace A
{//存储在vector的值可能是int或者string 不同类型,写为模版template<class T>class vector{public://若为私有,访问时需要突破类域,因此重命名为公有typedef T* iterator;//构造vector(){ }//析构~vector(){if (_start)delete[] _start;_start = _finish = _end_of_storage = nullptr;}private://给缺省值,缺省值主要是给没有显⽰在初始化列表初始化的成员使⽤的,不在初始化列表初始化的成员也会走初始化列表,如果这个成员在声明位置给了缺省值,初始化列表则用这个缺省值初始化iterator _start = nullptr;iterator _finish = nullptr;iterator _end_of_storage = nullptr;};	
}

先实现一些简单的功能

	//求空间大小size_t capacity(){//指针差值return _end_of_storage - _start;}//有效元素个数size_t size(){return _finish - _start;}//重载[],下标访问T& operator[](size_t i){assert(i < size());return _start[i];}

尾插(删)和扩容

实现尾部插入之前,需要判断先判断空间的大小,如果大小不够,需要扩容。

而关于扩容,并非是只在尾插时使用,所以需要在内部再次判断。

步骤;1,直接new与所需空间大小相同的空间即n。

2,即拷贝原空间的数据到新空间,并delete原空间。

但是我们需要注意的一点是在拷贝原空间的数据时,使用memcpy对内置类型的拷贝时满足我们的需求,但是在对自定义类型的拷贝时是值拷贝,也就是浅拷贝,不符合需求,此时解决办法是遍历原空间依次赋给新空间。

3,更新首尾指针和空间大小。

	//扩容void reserve(size_t n){if (n > capacity()){//记录旧的size,因为_start更新后,size的值会改变size_t old_size = size();T* tmp = new T[n];if (_start){//memcpy(tmp, _start, sizeof(T) * size());for (size_t i = 0; i < old_size; i++){tmp[i] = _start[i];}delete[] _start;}_start = tmp;_finish = _start + old_size;_end_of_storage = _start + n;}}void push_back(const T& x){if (_finish == _end_of_storage){size_t newcapacity = capacity() == 0 ? 4 : 2 * capacity();reserve(newcapacity);}*_finish = x;++_finish;}//尾删void pop_back(){assert(_start < _finish);--_finish;}

顺序表

resize 开空间+初始化

reservve 单纯开空间

emplace和insert功能类似,插入,细节有差别

vector< char >不能替代string,string兼容c语言。

1,string 数组后面有’ \0 ',vector< char >没有。

2,string += 字符或者字符串,即插入字符,字符串,string的find可以查找子串

3,vector< char >可以调用算法库的查找,未找到return last;

如何看源码

1,了解功能

2,抓核心枝干

时间换空间:顺序表缩容逻辑(不划算)

空间换时间:(比较划算)

inert(插入)

//pos是一个指针,是iterator即T*类型的
void insert(iterator pos, const T& x)
{//位置不能越界assert(pos >= _start);assert(pos <= _finish);//1,判断空间,不够扩容//2,拷贝原数据if (_finish == _end_of_storage){size_t newcapacity = _end_of_storage == 0 ? 4 : 2 * capacity();reserve(newcapacity);}iterator it = _finish - 1;while (pos >= it){*(it + 1) = *it;--it;}*it = x;++_finish;
}

迭代器失效

代码看似没有问题,其实在扩容后会形成迭代器失效,pos的位置已经丢失,

所以需要想办法得到扩容后新的pos的位置。

迭代器失效在vs下会强制检查,迭代器失效后不能访问,访问会崩溃报错。

失效原因:可能是底层成为野指针,即缩容逻辑,也可能是删除后,位置更改。

g++下没有强制检查。

失效后不要访问,重新赋值后再访问。

	if (_finish == _end_of_storage){size_t len = pos - _start;size_t newcapacity = _end_of_storage == 0 ? 4 : 2 * capacity();reserve(newcapacity);pos = len + _start;}

erase(删除)

关于erase也存在迭代器失效的问题,解决办法是返回一个迭代器,在删除后接收。

//.c//不返回值
//迭代器失效在vs下会强制检查,迭代器失效后不能访问,访问会崩溃报错。void erase(iterator pos){assert(pos >= _start);assert(pos <= _finish);iterator it = pos + 1;while (it < _finish){*(it - 1) = *it;++it;}--_finish;//更新pos,否则迭代器会失效return pos;}//返回迭代器iterator erase(iterator pos){assert(pos >= _start);assert(pos <= _finish);iterator it = pos + 1;while (it < _finish){*(it - 1) = *it;++it;}--_finish;//更新pos,否则迭代器会失效return pos;}//------------------------------------------
//testA::vector<int> v1 = { 1,2,2,2,3,4,5,6,6,6 };for (auto e : v1)
{cout << e << " ";
}
cout << endl;A::vector<int>::iterator it = v1.begin();
while (it != v1.end())
{if (*it % 2 == 0){v1.erase(it);}else{it++;}
}for (auto e : v1)
{cout << e << " ";
}
cout << endl;

resize(调整空间)

比原来空间大

比如说,原来数据为:vector< int > v = { 1,2,3,4,5 };

使用resize(10),如果不给值,会默认赋值为0

会将数据置为1,2,3,4,5,0,0,0,0,0

再如resize(10,2)

会变为1,2,3,4,5,2,2,2,2,2

比原来空间小

resize(2)

变为1,2

	void resize(size_t n, T val = T()){if (n > size()){//插入数据,先扩容reserve(n);while (_start + n != _finish){*_finish = val;++_finish;}}else{_finish = _start + n;}}

深浅拷贝

在这里插入图片描述

memcpy是一种值拷贝。对深拷贝的自定义类型会进行浅拷贝,然后就会发生问题,

对于内置类型是没有问题的。

解决办法是,一个一个赋值解决。

迭代器

一般情况下我们会实现两种迭代器,一种是普通版本的迭代器,可以修改其本身,也可以修改指向的对象;另外一种是const修饰的迭代器,其本身可以修改,指向对象不可以修改。

需要注意的一点是迭代器的end()是指向结尾数据的下一个位置,我们此处的_finish正好满足条件,所以直接放回即可。

	typedef T* iterator;typedef const T* const_iterator;//迭代器iterator begin(){return _start;}iterator end(){return _finish;}//const迭代器const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}

拷贝和赋值(v2(v1)和v1 = v3)

	//v2(v1)vector(vector<T>& v){//申请和v1相同的空间大小,使用范围for(支持迭代器就支持范围for)尾插数据到新空间即可。 reserve(v.capacity());for (auto& e : v){push_back(e);}}void swap(vector<T>& v){std::swap(_start, v._start);std::swap(_finish, v._finish);std::swap(_end_of_storage, v._end_of_storage);}//v1 = v3vector<T>& operator=(vector<T> v){//直接交换即可,因为拷贝构造已经形成swap(v);return *this;}

多个数据插入

	//对val的类型不确定,给缺省值,是匿名对象vector(size_t n, const T& val = T()){reserve(n);for (size_t i = 0; i < n; i++){push_back(val);}}

但是如果仅仅只写这一种的话,在我们实现对迭代器区间初始化时,会发生错误匹配的情况,是模板实例化时的问题,

可以想到的是把size_t类型修改为int类型,这样就可以解决,但是这样有引发新的问题,对于无符号整型类型没办法处理,所以直接两个都留下,构成了函数重载。

	//为了解决模版实例化的问题vector(int n, const T& val = T()){reserve(n);for (int i = 0; i < n; i++){push_back(val);}}//c++11vector(initializer_list<T> il){reserve(il.size());//此处用引用,因为T的类型不确定for (auto& e : il){push_back(e);}}

迭代器区间初始化

	//迭代器区间初始化//写为模版,可以初始化非iterator的类型template <class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);++first;}}iterator erase(iterator pos){assert(pos >= _start);assert(pos <= _finish);iterator it = pos + 1;while (it < _finish){*(it - 1) = *it;++it;}--_finish;//更新pos,否则迭代器会失效return pos;}

相关文章:

C++(初阶)(十)——vector模拟实现

vector vector构造尾插&#xff08;删&#xff09;和扩容inert&#xff08;插入&#xff09;迭代器失效erase&#xff08;删除&#xff09;resize&#xff08;调整空间&#xff09;深浅拷贝迭代器拷贝和赋值&#xff08;v2(v1)和v1 v3&#xff09;多个数据插入迭代器区间初始化…...

利用解析差异SSRF + sqlite注入 + waf逻辑漏洞 -- xyctf 2025 fate WP

本文章附带TP(Thinking Process)! #!/usr/bin/env python3 # 导入所需的库 import flask # Flask web框架 import sqlite3 # SQLite数据库操作 import requests # HTTP请求库 import string # 字符串处理 import json # JSON处理app flask.Flask(__name__) # 创建Flask应…...

VScode无法激活conda虚拟环境,不显示虚拟环境名称

在VScode中终端中激活环境时出现下面的情况 PS F:\Model\stMMR-main> conda activate env_mamba usage: conda-script.py [-h] [--no-plugins] [-V] COMMAND ... conda-script.py: error: argument COMMAND: invalid choice: activate (choose from clean, compare, config…...

vscode Colipot 编程助手

1、登录到colipot&#xff0c;以github账号&#xff0c;关联登录 点击【continue】按钮&#xff0c;继续。 点击【打开Visual Studio Code】&#xff0c;回到vscode中。 2、问一下11? 可以看出&#xff0c;很聪明&#xff0c;一下子就算出来了。 3、帮我们写一个文件&#xf…...

vscode中REST Client插件

最近发现vscode中REST Client插件也可以测试接口 简介 在 VS Code 中&#xff0c;REST Client 是一个非常受欢迎的插件&#xff0c;用于测试和调试 RESTful API。以下是关于该插件的安装、使用和功能的详细介绍&#xff1a; 安装 REST Client 插件 打开 VS Code。点击左侧的扩…...

路由器工作在OSI模型的哪一层?

路由器主要工作在OSI模型的第三层&#xff0c;即网络层。网络层的主要功能是将数据包从源地址路由到目标地址&#xff0c;路由器通过检查数据包中的目标IP地址&#xff0c;并根据路由表确定最佳路径来实现这一功能。 路由器的主要功能&#xff1a; a、路由决策&#xff1a;路…...

(PROFINET 转 EtherCAT)EtherCAT/Ethernet/IP/Profinet/ModbusTCP协议互转工业串口网关

型号 协议转换通信网关 PROFINET 转 EtherCAT MS-GW31 概述 MS-GW31 是 PROFINET 和 EtherCAT 协议转换网关&#xff0c;为用户提供两种不同通讯协议的 PLC 进行数据交互的解决方案&#xff0c;可以轻松容易将 EtherCAT 网络接入 PROFINET 网络中&#xff0c;方便扩展&…...

【教程】MacBook 安装 VSCode 并连接远程服务器

目录 需求步骤问题处理 需求 在 Mac 上安装 VSCode&#xff0c;并连接跳板机和服务器。 步骤 Step1&#xff1a;从VSCode官网&#xff08;https://code.visualstudio.com/download&#xff09;下载安装包&#xff1a; Step2&#xff1a;下载完成之后&#xff0c;直接双击就能…...

Solidity基础入门—web3

Remix介绍 官网地址 Remix 是一个基于浏览器的 Solidity 开发环境&#xff0c;主要用于编写、测试、调试和部署以太坊智能合约。 Solidity基本数据类型 类型说明示例uint / int无符号 / 有符号整数uint256, int8, int256bool布尔类型&#xff08;true / false&#xff09;bo…...

微信小程序 request 流式数据处理

什么是流式数据处理&#xff1f; 流式数据处理&#xff08;Streaming Data&#xff09;指逐步接收并处理数据片段的技术&#xff0c;无需等待全部数据加载完成。适用于大文件下载、实时日志、AI生成报告等场景&#xff0c;可显著降低内存占用并提升用户体验。 微信小程序中的…...

Kotlin与HttpClient编写视频爬虫

想用Apache HttpClient库和Kotlin语言写一个视频爬虫。首先&#xff0c;我需要确定用户的具体需求。视频爬虫通常涉及发送HTTP请求&#xff0c;解析网页内容&#xff0c;提取视频链接&#xff0c;然后下载视频。可能需要处理不同的网站结构&#xff0c;甚至可能需要处理动态加载…...

数据结构:通俗解释AOE 网中事件的最早发生时间和最迟发生时间

1. 事件的最早发生时间 在 AOE 网&#xff08;Activity On Edge Network&#xff0c;边表示活动的网络&#xff09;中&#xff0c;事件的最早发生时间指从源点&#xff08;起点&#xff09;到该事件结点的最长路径长度&#xff08;即所需时间&#xff09;。它决定了所有以该事…...

爬虫中遇到的问题

网页假请求导致的阻塞 可以在requests请求当中添加timeout参数&#xff0c;来让网站重新请求 在爬虫请求中&#xff0c;timeout参数的主要作用是控制请求的最大等待时间&#xff0c;避免因服务器响应缓慢或网络问题导致程序长时间阻塞&#xff0c;从而提升爬虫的效率和稳定性…...

聊一聊没有接口文档时如何开展测试

目录 一、前期准备与信息收集 二、使用抓包工具分析接口 三、逆向工程构造测试用例 四、安全测试 五、 模糊测试&#xff08;Fuzz Testing&#xff09; 六、记录并维护发现的接口信息 七、 推动团队规范流程 其它注意事项 在我们进行接口测试时&#xff0c;总会遇到各种…...

第一部分:MCP协议与多智能体系统基础-第1课:MCP服务协议核心架构解析

以下是为《MCP服务协议核心架构解析》设计的课件内容&#xff0c;采用“概念解析→代码实践→运行验证”三段式教学结构&#xff0c;结合可视化图表与可运行代码示例&#xff0c;增强学生对MCP协议核心组件的理解与实操能力&#xff1a; 一、课程导入&#xff1a;MCP协议定位与…...

WEB安全--内网渗透--捕获NET-NTLMv2 Hash

一、前言 在LM&NTLM基础篇中我们了解到了NTLM协议的流程与加密的方式&#xff0c;以及具体的在type3的response中Net-ntlm hash v2的生成方式。 思考&#xff1a; 如果我们入侵的服务器中有域管理员的登录后的密码缓存&#xff0c;那就能用工具&#xff08;mimikatz&…...

使用 J-Flash 读取芯片 Flash 数据的方法

基本读取步骤 硬件连接 确保 J-Link 调试器正确连接到目标板 给目标板供电&#xff08;可通过 J-Link 供电或外部电源&#xff09; 创建/打开项目 启动 J-Flash 软件 选择 "File" > "New Project" 创建新项目 选择正确的目标芯片型号&#xff08;或…...

Spring MVC 返回 JSON 视图的方式及对比(6种)

Spring MVC 返回 JSON 视图的方式及对比&#xff08;新增 MappingJackson2JsonView&#xff09; 1. 方式一&#xff1a;ResponseBody 注解 作用&#xff1a;直接返回对象&#xff0c;由消息转换器&#xff08;如 Jackson&#xff09;序列化为 JSON。 适用场景&#xff1a;简单…...

SpringMVC的数据响应

1)页面跳转 直接返回字符串 通过ModelAndView对象返回 //方式三(model和view拆开)RequestMapping("/quick4")public String save4(Model model){model.addAttribute("username","lisi3");return "success";}//方式二RequestMapping(&…...

GraphRAG与知识图谱

一、GraphRAG介绍 1.1 什么是 Graph RAG&#xff1f; Graph RAG&#xff08;Retrieval-Augmented Generation&#xff09;&#xff0c;是一种基于知识图谱的检索增强技术&#xff0c; 通过构建图模型的知识表达&#xff0c;将实体和关系之间的联系用图的形式进行展示&#xff…...

hive通过元数据库删除分区操作步骤

删除分区失败&#xff1a; alter table proj_60_finance.dwd_fm_ma_kpi_di_mm drop partition(year2025,month0-3,typeADJ); 1、查询分区的DB_ID、TBL_ID – 获取数据库ID-26110 SELECT DB_ID FROM DBS WHERE NAME ‘proj_60_finance’; – 获取表ID-307194 SELECT TBL_ID FR…...

LINUX 5 cat du head tail wc 计算机拓扑结构 计算机网络 服务器 计算机硬件

计算机网络 计算机拓扑结构 计算机按性能指标分&#xff1a;巨型机、大型机、小型机、微型机。大型机、小型机安全稳定&#xff0c;小型机用于邮件服务器 Unix系统。按用途分&#xff1a;专用机、通用机 计算机网络&#xff1a;局域网‘、广域网 通信协议’ 计算机终端、客户端…...

flink 增量快照同步文件引用关系和恢复分析

文章目录 文件引用分析相关代码分析从state 恢复&#xff0c;以rocksdb为例不修改并行度修改并行度keyGroupRange过程问题 文件引用分析 每次生成的checkpoint 里都会有所有文件的引用信息 问题&#xff0c;引用分析里如何把f1,f2去掉了&#xff0c;可以参考下面的代码&#…...

属性修改器 (AttributeModifier)

主页面设置组件 import { MyButtonModifier } from ../datastore/MyButtonModifier;Entry ComponentV2 struct MainPage {// 支持用状态装饰器修饰&#xff0c;行为和普通的对象一致Local modifier: MyButtonModifier new MyButtonModifier();build() {Column() {Button(&quo…...

汽车BMS技术分享及其HIL测试方案

一、BMS技术简介 在全球碳中和目标的战略驱动下&#xff0c;新能源汽车产业正以指数级速度重塑交通出行格局。动力电池作为电动汽车的"心脏"&#xff0c;其性能与安全性不仅直接决定了车辆的续航里程、使用寿命等关键指标&#xff0c;更深刻影响着消费者对电动汽车的…...

电网电能质量分析:原理、算法及实际应用

一、引言 在现代社会&#xff0c;电力供应的稳定性和可靠性对工业生产、社会生活的各个方面都至关重要。电能质量作为衡量电力系统供电能力的关键指标&#xff0c;其优劣直接影响到电力设备的运行效率、使用寿命以及生产过程的稳定性。随着电力系统规模的不断扩大&#xff0c;新…...

PyCharm Community社区版链接WSL虚拟环境

#记录工作 在过去&#xff0c;PyCharm Community Edition&#xff08;社区版&#xff09;不具备链接 WSL 虚拟环境的功能&#xff0c;该功能仅在 PyCharm Professional&#xff08;专业版&#xff09;和企业版中提供。如今&#xff0c;从 PyCharm Community Edition 2024.3.5 …...

2026考研数学张宇武忠祥复习视频课,高数基础班+讲义PDF

2026考研数学武忠祥老师课&#xff08;网盘&#xff09;&#xff1a;点击下方链接 2026考研数学武忠祥网课&#xff08;最新网盘&#xff09; 一、基础阶段&#xff08;3-5个月&#xff09; 目标&#xff1a;搭建知识框架掌握基础题型 教材使用&#xff1a; 高数&#xff1a;…...

Spring Boot嵌入前端静态资源:从原理到实战的完整指南

在Java Spring Boot项目中集成前端静态资源是构建现代Web应用的必备技能。本文将深入解析Spring Boot的静态资源处理机制&#xff0c;通过实战案例演示完整的集成流程&#xff0c;并分享性能优化与安全加固的最佳实践。 一、Spring Boot静态资源处理原理 1.1 默认资源路径 S…...

DeepSeek对比ChatGPT有何改进,可以用更低成本计算

下面是基于DeepSeek公开论文和代码&#xff0c;与ChatGPT对比后总结的改进点&#xff0c;以及其为何能用更少算力训练大模型的解析。 https://arxiv.org/pdf/2412.19437 1. 改进点对比 1.1 架构稀疏化与混合专家&#xff08;MoE&#xff09;设计 DeepSeek采用稀疏激活与混合…...

JavaScript双问号操作符(??)详解,解决使用 || 时因类型转换带来的问题

目录 JavaScript双问号操作符&#xff08;??&#xff09;详解&#xff0c;解决使用||时因类型转换带来的问题 一、双问号操作符??的基础用法 1、传统方式的痛点 2、双问号操作符??的精确判断 3、双问号操作符??与逻辑或操作符||的对比 二、复杂场景下的空值处理 …...

Go语言从零构建SQL数据库(5)-Pratt解析算法:SQL表达式解析的核心引擎

Pratt解析算法&#xff1a;SQL表达式解析的核心引擎 1. 算法概述与工作原理 Pratt解析算法&#xff08;自顶向下运算符优先级解析&#xff09;是一种优雅的表达式解析方法&#xff0c;特别适合处理具有不同优先级运算符的复杂表达式。在我们的SQL解析器中&#xff0c;它负责解…...

数字政府与电子政务综合分析报告

数字政府与电子政务综合分析报告 一、引言 随着信息技术的飞速发展&#xff0c;数字政府和电子政务成为全球公共管理领域的重要趋势。数字政府和电子政务的建设不仅是提升政府治理能力的必然选择&#xff0c;也是推动国家治理现代化的重要途径。本文将对数字政府和电子政务进…...

服务器虚拟化技术深度解析:医药流通行业IT架构优化指南

一、服务器虚拟化的定义与原理 &#xff08;一&#xff09;技术定义&#xff1a;从物理到虚拟的资源重构 服务器虚拟化是通过软件层&#xff08;Hypervisor&#xff09;将物理服务器的CPU、内存、存储、网络等硬件资源抽象为逻辑资源池&#xff0c;分割成多个相互隔离的虚拟机…...

QT ARM 开发环境搭建

搭建 QT ARM 开发环境主要包括主机环境配置、交叉编译工具链安装、QT 库交叉编译和 QT Creator 配置几个步骤。以下是详细流程: 一. 主机环境准备 系统要求 推荐 Ubuntu 18.04/20.04 LTS 或更高版本 至少 50GB 可用磁盘空间 8GB 以上内存 安装基础依赖 sudo apt update sud…...

【设计模式】外观模式

简介 想象你要在家里看电影&#xff0c;需要做以下操作&#xff1a; 打开电视启动音响调暗灯光关闭窗帘 如果每次都要手动操作这些步骤会很麻烦。外观模式可以帮你将这些步骤封装成一个统一的接口&#xff0c;比如“一键观影模式”&#xff0c;你只需按一个按钮&#xff0c;…...

[特殊字符] 驱动开发硬核特训 · Day 5 - 深入解析 Platform Driver 驱动框架

主题&#xff1a;深入解析 Platform Driver 驱动框架 —— 从架构设计到工程实战 平台驱动&#xff08;platform driver&#xff09;是 Linux 内核中应用最广泛的一种设备驱动框架。它用于管理那些不依赖总线枚举机制的固定外设&#xff0c;如 GPIO 控制器、I2C 控制器、SPI 控…...

创意 Python 爱心代码

在编程的世界里&#xff0c;Python 以其简洁易用和丰富的库而备受喜爱。用 Python 编写爱心代码&#xff0c;不仅能展现编程的魅力&#xff0c;还能传递温暖与爱意。今天就来分享几种创意 Python 爱心代码。 一、基于turtle库绘制爱心 turtle库是 Python 内置的图形库&#x…...

【群晖】挂载小雅alist到AList网盘中

群晖开启远程 在命令行远程到主机 ssh 用户名主机名终端中执行下方命令创建一个在AList中挂载小雅所需要的token&#xff1a; docker exec -i xiaoya sqlite3 data/data.db <<EOF select value from x_setting_items where key "token"; EOF 如果报权限错误…...

嵌入式C语言11(宏/程序的编译过程)

宏 ⦁ 基本概念 C语言中可以利用宏定义实现文本的快速替换&#xff0c;注意&#xff1a;宏定义是单纯的文本替换&#xff0c;不检查语法是否合法。 C语言标准中提供了很多的预处理指令&#xff0c;比如#include、#pragma…以#开头的都属于预处理指令。 预处理指令指的是在…...

城电科技 | 太阳能花怎么选择?光伏太阳花的应用场景在哪里?

在当下追求绿色能源的时代&#xff0c;珠海城电科技的太阳能花逐渐走进人们的视野。那么&#xff0c;太阳能花究竟是什么呢&#xff1f;太阳能花属于光伏发电应用的一种&#xff0c;巧妙地利用太阳能进行发电。它还有着光伏太阳花、光伏发电花、光伏智慧花等别称。 城电科技-光…...

[C++面试] C++中各类括号的差异:[]、{}、<>、()

括号类型典型场景编译期/运行时安全性考量()函数调用、运算优先级两者注意强制转换风险[]数组访问、Lambda捕获运行时主导防止越界访问{}统一初始化、聚合类型编译期检查阻止隐式窄化转换<>模板实例化、元编程编译期注意模板展开爆炸问题 int x{5}; int x(5);有什么区别…...

Qt 入门 3 之对话框 QDialog(1)

Qt 入门 3 之对话框 QDialog 本文从以下几点分开讲述&#xff1a; - 对话框的基本原理介绍 - 两种不同类型的对话框 - 一个由多个窗口组成并且窗口间可以相互切换的程序 1.模态和非模态对话框 QDialog 类是所有对话框窗口类的基类。对话框窗口是一个经常用来完成短小任务或者…...

Python设计模式:组合模式

1. 什么是组合模式 组合模式&#xff08;Composite Pattern&#xff09;是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构以表示“部分-整体”的层次关系。组合模式使得客户端对单个对象和组合对象的使用具有一致性。换句话说&#xff0c;组合模式可以让客户端以相…...

第九天 - psutil系统监控库 - 资源监控仪表盘 - 练习:实时CPU/Memory监控

使用Python打造实时资源监控仪表盘&#xff08;psutilFastAPI&#xff09; 一、为什么要学习系统监控&#xff1f; 在软件开发中&#xff0c;系统资源监控是每个开发者都需要掌握的重要技能。无论是排查性能瓶颈、优化程序效率&#xff0c;还是确保服务稳定性&#xff0c;实时…...

Spring Boot内嵌服务器全解析:Tomcat vs Jetty vs Undertow 选型指南

精心整理了最新的面试资料和简历模板&#xff0c;有需要的可以自行获取 点击前往百度网盘获取 点击前往夸克网盘获取 引言 在Spring Boot应用中&#xff0c;内嵌服务器的选择直接影响应用的性能、资源占用和扩展性。尽管Tomcat作为默认选项被广泛使用&#xff0c;Jetty和Unde…...

【嵌入式学习6】多任务版TCP服务器

目录 如何实现&#xff1a; 客户端1.0版本&#xff1a; 服务端&#xff1a; 客户端2.0版本&#xff1a; thread.join() 是一个线程同步方法&#xff0c;用于主线程等待子线程完成。当你调用 thread.join() 时&#xff0c;主线程会阻塞&#xff0c;直到调用 join() 的子线程…...

抖音直播位置与IP属地不同?如何实现

抖音作为头部平台吸引了大量主播和观众。然而&#xff0c;许多用户发现一个令人困惑的现象&#xff1a;直播间显示的位置信息与账号IP属地不一致。本文将深入分析这一现象背后的原因&#xff0c;探讨可能带来的影响&#xff0c;并提供实用的解决方案。 一、抖音直播显示的位置与…...

Scala(六)

本节课学习了数组、列表、Set集合、Map集合、元组、集合中常用的函数等等。 数组包括可变数组、不可变数组&#xff0c;学习了如何定义和创建数组、可变数组和不可变数组之间的转换、多维数组、数组遍历 列表学习了如何添加元素、合并集合、如何访问元素、遍历列表 Set集合学…...

Android 11.0 framework系统首次开机添加锁屏壁纸的功能

1.前言 在11.0的系统rom定制化开发中,在某些时候需要默认设置锁屏壁纸功能,而系统中没有在 framework/base下没有单独的默认锁屏壁纸的图片替换,默认就是锁屏壁纸和主屏幕壁纸 都是同一张壁纸,所以就需要添加接口来实现设置默认锁屏壁纸的功能 2.framework系统首次开机添…...