【C++】set和multiset的常用接口详解
1. 序列式容器和关联式容器
在介绍set之前我们先简单介绍一下什么是序列式容器和关联式容器。
前⾯我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间⼀般没有紧密的关联关系,⽐如交换⼀下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。
关联式容器也是⽤来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是 ⾮线性结构,两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了。顺序容器中的元素是按关键字来保存和访问的。关联式容器有map/set系列unordered_map/unordered_set系列。
set是key搜索场景的结构。
2. set系列的使⽤
2.1 set和multiset参考⽂档
参考文档:<set> - C++ Reference
先来总体看一下set的相关接口。
总的来说还是之前我们在vector,string接触过的那些东西。虽然看起来接口很多,但常用的以及会学习到的就那些。
2.2 set类的介绍
set的声明如下。
- 参数1:T就是set底层关键字的类型。这个T就是key,名字不同。
- 参数2:set默认要求T⽀持⼩于⽐较,如果不⽀持或者想按⾃⼰的需求⾛可以⾃⾏实现仿函数传给第⼆个模版参数。
- 参数3:set底层存储数据的内存是从空间配置器申请的(空间配置器),如果需要可以⾃⼰实现内存池,传给第三个参数。
⼀般情况下,我们都不需要传后两个模版参数。
2.3 set的构造和迭代器
先看它的构造函数。

再来看看他的迭代器。
- 从文档介绍可以看出这是一个双向迭代器,⽀持正向和反向迭代遍历,遍历默认按升序顺序,因为底层是⼆叉搜索树,迭代器遍历⾛的中序。
- ⽀持迭代器就意味着⽀持范围for,set的iterator和const_iterator都不⽀持迭代器修改数据,修改关键字数据,破坏了底层搜索树的结构。
2.4 set的增删查(不支持改)
2.4.1 insert
先看insert,增。
增这里首先支持增加一个value_type类型的东西,value_type什么?
从这里可以看到,其实就是我们传的那个关键字Key,并且上面那个key_type也是key。所以就是插入一个key。这里的返回值类型后面会说,暂时不关注。
用set的时候要包含头文件#include <set>
#include <iostream>
#include <set>
using namespace std;
int main()
{set<int> s;s.insert(2);s.insert(1);s.insert(4); //重复s.insert(3);s.insert(4); //重复return 0;
}
第二个参数不传的话,默认排升序。
用迭代器遍历一下。
int main()
{set<int> s;s.insert(2);s.insert(1);s.insert(4);s.insert(3);s.insert(4);auto it = s.begin();while (it != s.end()){cout << *it << ' ';it++;}cout << endl;return 0;
}
如果这里不用auto的话,就是 set<int>::iterator it = s.begin();
可以看到此时的s就是一个去重并且升序的状态。
如果想变成降序,set的参数列表就多传一个参数。
set<int, greater<int>> s;
此时的s就是去重并且排降序。
还支持在某个位置插入,一般不用。
支持插入一段迭代器区间。
还支持插入initializer_list。
就是用大括号括起来插入。
set<int> s;
s.insert(2);
s.insert(1);
s.insert(4);
s.insert(3);
s.insert(4);
s.insert({ 7, 5, 8, 6 }); //插入一段列表值auto it = s.begin();
while (it != s.end())
{cout << *it << ' ';it++;
}
cout << endl;
而且如果这个列表里面有冗余的值,也会去掉。
set除了支持整形,也支持字符串,如下。
set<string> ss({ "hello", "eat", "bad", "cat" });
auto it = ss.begin();
while (it != ss.end())
{cout << *it << ' ';it++;
}
cout << endl;
字符串的话比较顺序是按照ASCII码顺序比的。
这里还有一种写法。
//set<string> ss({ "hello", "eat", "bad", "cat" });set<string> ss = { "hello", "eat", "bad", "cat" }; //另一种写法
第一种写法就是直接调用构造函数,第二种写法就是构造的隐式类型转换,构造+拷贝构造 优化成 构造。
2.4.2 find和erase
find支持value_type的查找,value_type就是T就是key。
找到了就返回这个迭代器,没找到就返回end,end就是最后一个位置的后一个位置。
删除有三个接口。
- 传迭代器过去,删除某个位置的值。
- 传一个值过去,传的这个值可能在容器里,也可能不在,如果在,就直接删除,然后返回删除了几个数,如果删除一个就返回1;如果这个值不在容器里,就会返回0,因为删除了0个数。(set每个数只有一个,但是multiset有多个)
- 传迭代器区间过去,删除一个区间的值。
我们先给这个容器一些值,并且打印出来。
set<int> s = { 3,1,5,6,4,9,2 };
for (auto e : s)
{cout << e << " ";
}
cout << endl;
比如说我们现在要删除最小值。直接传begin过去就可以。
s.erase(s.begin()); //删除最小值
因为s默认排升序,第一个值就是最小值,迭代器是左闭右开的,就是begin。
这里用到的就是第1个接口。这个接口的返回值是删除位置的后一个位置的迭代器。
我们也可以输入一个值让他删除。
int x;
cin >> x; //输入一个值
int ret = s.erase(x); //ret接收erase的返回值
if (ret == 0)cout << "此值不存在" << endl;
for (auto e : s)
{cout << e << " ";
}
cout << endl;
先输入一个存在的值。
再输入一个不存在的值试试。
不存在的话什么都不删。这里用到的就是第2个接口。
第二个接口其实可以理解为是用find+第一个接口来实现的,如下。
int x;
cin >> x; //输入一个值
auto pos = s.find(x);//先找值
if (pos != s.end()) //找到了就删
{s.erase(pos);cout << "删除成功" << endl;
}
elsecout << "此值不存在" << endl;
迭代器区间删除在2.4.4里会说。
删除后迭代器失效问题
这里删除数据绝对会导致迭代器失效。失效有两种情况,一是导致野指针问题,二是删除后迭代器意义改变。具体分析需要结合底层。比如说我们删除一个数之后再访问这个迭代器,vs平台下是一定会报错的。
2.4.3 count
count就是传一个value_type,然后返回这个值在容器里的个数。虽然set里的值有就是1,没有就是0,是要和multiset保持一致,因为multiset里不仅是有没有这个值,他还可能有多个。
count确定某个值在不在会比find更方便。
set<int> s = { 3,1,5,6,4,9,2 };
for (auto e : s)
{cout << e << " ";
}
cout << endl;int x;
cin >> x; //输入一个值
if (s.count(x)) //非0就存在
{cout << x << "存在" << endl;
}
else
{cout << x << "不存在" << endl;
}
2.4.4 lower_bound 和 upper_bound
- lower_bound 是 返回⼤于等于val位置的迭代器;upper_bound 是 返回⼤于val位置的迭代器。
- 这样设计是为了方便我们找一段迭代器区间,因为只要是迭代器区间,就必须是左闭右开的。
比如说现在有一堆值,如下。
set<int> s = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
现在要求 : 1. 删除[30, 50]区间的值 2. 删除[25, 65]之间的值 。
先看第一个。删30到50之间的值,但是迭代器区间只能是左闭右开,左闭能删除,右开怎么办?
set<int> s = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
//删除[30,50]
auto left = s.lower_bound(30); //左闭
给upper_bound传50过去,upper_bound返回比50大的第一个迭代器。
set<int> s = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
//删除[30,50]
auto left = s.lower_bound(30); //左闭 返回 >=30
auto right = s.upper_bound(50);//右开 返回 >50
这里正好有30,就返回30;返回比50大的第一个迭代器,60,60是开区间。
然后我们删掉这个区间。这里就用到了前面没说的删除的第三个接口,传迭代器区间。
s.erase(left, right); //删除
for (auto e : s)
{cout << e << " ";
}
cout << endl;
再看第二个,删除25到65之间的值。25和65都不在这个容器里,怎么办?还是一样的,lower_bound传25过去,没有25就返回比25大的第一个迭代器,给upper_bound传65过去,upper_bound返回比65大的第一个迭代器。
set<int> s = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
//删除[25,65]
auto left = s.lower_bound(25); //左闭 返回 >=25
auto right = s.upper_bound(65);//右开 返回 >65
s.erase(left, right); //删除
for (auto e : s)
{cout << e << " ";
}
cout << endl;
3.set和multiset的差别
multiset的使用不需要再包含别的头文件,就是#include <set>。

那么insert / find / count / erase都围绕着⽀持值冗余有所差异。
insert相⽐set的不同的是,multiset的支持插入已经存在的值。
count相⽐set的不同的是,multiset的会返回x的实际个数。
multiset<int> ms = { 2,5,4,7,6,8,2,1,5,2 };
for (auto e : ms)
{cout << e << ' ';
}
cout << endl;
cout << ms.count(2) << endl;
cout << ms.count(9) << endl;
2在容器里有3个,count就返回3,9不在容器里,就返回0。

可以自己可以走一遍中序遍历,会发现框起来的3是中序遍历的第一个3,就返回它。
返回中序的第一个,我们就可以把所有相同的值全打印出来。
auto tar = ms.find(2);
while (tar != ms.end() && *tar == 2)
{cout << *tar << " ";tar++;
}
cout << endl;
erase不同的是,multiset的erase给值时会删除所有的x。
ms.erase(2);
for (auto e : ms)
{cout << e << ' ';
}
cout << endl;
4.相关练习
4.1 两个数组的交集
349. 两个数组的交集 - 力扣(LeetCode)
这个题的思路:先用set去重+排序,然后用两个指针比较两个数组的值,相同的就放到一起。
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
{set<int> s1, s2;vector<int> ret;for (auto e : nums1) s1.insert(e);for (auto e : nums2) s2.insert(e);
}
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
{set<int> s1, s2;vector<int> ret;for (auto e : nums1) s1.insert(e);for (auto e : nums2) s2.insert(e);auto it1 = s1.begin();auto it2 = s2.begin();
}
相同就放到ret里,然后同时往后移动,不同的话,谁小谁就后移。
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
{set<int> s1, s2;vector<int> ret;for (auto e : nums1) s1.insert(e);for (auto e : nums2) s2.insert(e);auto it1 = s1.begin();auto it2 = s2.begin();while (it1 != s1.end() && it2 != s2.end()){if (*it1 == *it2){ret.push_back(*it1); //相同就放到retit1++; it2++;}else if (*it1 > *it2) it2++;else it1++;}return ret;
}
最后返回ret就行。
4.2 环形链表
142. 环形链表 II - 力扣(LeetCode)
这道题用set写就会特别简单,思路:遍历这个链表,把节点的地址存到set里,如果出现相同的结点地址,就是带环,否则不带环。(存的是地址不是值!因为不同的节点可能存在值相同)
当我们遍历到-4时,前面这4个节点地址都没出现重复,继续遍历。
-4节点的下一个是2。
因为2的地址出现了两次,所以直接就可以判断为带环。代码实现如下。
class Solution {
public:ListNode *detectCycle(ListNode *head) {ListNode *cur = head;set<ListNode*> s;while(cur){if(s.count(cur)) return cur;else s.insert(cur);cur = cur->next;}return nullptr;}
};
本次分享就到这里了,我们下篇见~
相关文章:
【C++】set和multiset的常用接口详解
前⾯我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,本篇文章将介绍一下map和multiset的使用。 1. 序列式容器和关联式容器 在介绍set之前我们先简单介绍一下什么是序列式容器和关联式容器。 前⾯我们已经接触过S…...
PostgreSQL 联合索引生效条件
最近面试的时候,总会遇到一个问题 在 PostgreSQL 中,联合索引在什么条件下会生效? 特此记录~ 前置信息 数据库版本 PostgreSQL 14.13, compiled by Visual C build 1941, 64-bit 建表语句 CREATE TABLE people (id SERIAL PRIMARY KEY,c…...
聊聊redisson的lockWatchdogTimeout
序 本文主要研究一下redisson的lockWatchdogTimeout lockWatchdogTimeout redisson/src/main/java/org/redisson/config/Config.java private long lockWatchdogTimeout 30 * 1000;/*** This parameter is only used if lock has been acquired without leaseTimeout param…...
数据结构第七章(三)-树形查找:红黑树
树形查找(二) 红黑树一、红黑树1.定义2.黑高3.性质 二、插入1.插入步骤2.举例 总结 红黑树 红黑树来喽~ 我们在上一篇说了二叉排序树(BST)和平衡二叉树(AVL),那么既然都有这两个了,…...
C++篇——多态
目录 引言 1,什么是多态 2. 多态的定义及实现 2_1,多态的构成条件 2_2,虚函数 2_3,虚函数的重写 2_4,虚函数重写的两个例外 2_4_1,协变(基类与派生类虚函数返回值类型不同) 2_4_2. 析构函数的重写(基类…...
AI实时对话的通信基础,WebRTC技术综合指南
在通过您的网络浏览器进行音频和视频通话、屏幕共享或实时数据传输时,您可能并不常思考其背后的技术。推动这些功能的核心力量之一就是WebRTC。2011年由谷歌发布的这个开源项目,如今已发展成为一个高度全面且不断扩展的生态系统。尤其是在AI技术大幅突破…...
【寻找Linux的奥秘】第五章:认识进程
请君浏览 前言1. 冯诺依曼体系结构数据流动 2. 操作系统(Operating System)2.1 概念2.2 设计OS的目的2.3 如何理解“管理”2.4 系统调用和库函数概念 3. 进程3.1 基本概念3.1.1 查看进程3.1.2 创建进程 3.2 进程状态3.2.1 简单介绍3.2.2 运行&&阻…...
uniapp微信小程序-长按按钮百度语音识别回显文字
流程图: 话不多说,上代码: <template><view class"content"><view class"speech-chat" longpress"startSpeech" touchend"endSpeech"><view class"animate-block" …...
支付宝创建商家订单收款码(统一收单线下交易预创建).net开发的软件附带大型XML文件可以删除吗?AlipaySDKNet.OpenAPI.xml
支付宝创建商家订单收款码(统一收单线下交易预创建)一个程序55MB,XML就带了35MB AlipaySDKNet.OpenAPI.xml,BouncyCastle.Crypto.xml 支付宝店铺收款码创建的程序,这些文件可以不用吗 在支付宝店铺收款码创建的程序中…...
Profinet转Ethernet/IP网关模块通信协议适配配置
案例背景 在某自动化生产车间中,现有控制系统采用了西门子 S7 - 1500 PLC 作为主要控制器,负责生产流程的核心控制。同时,由于部分设备的历史原因,存在使用 AB 的 PLC 进行特定环节控制的情况。为了实现整个生产系统的信息交互与…...
4.6/Q1,GBD数据库最新文章解读
文章题目:Global burden, subtype, risk factors and etiological analysis of enteric infections from 1990-2021: population based study DOI:10.3389/fcimb.2025.1527765 中文标题:1990-2021 年肠道感染的全球负担、亚型、危险因素和病因…...
数字孪生技术:开启未来的“镜像”技术
想象一下,你拥有一个与现实世界一模一样的 “数字分身”,它不仅长得像你,行为举止、思维方式也和你毫无二致,甚至能提前预知你的下一步行动。这听起来像是科幻电影里的情节,但数字孪生技术却让它在现实中成为了可能。数…...
Java 序列化(Serialization)
一、理论说明 1. 序列化的定义 Java 序列化是指将对象转换为字节流的过程,以便将其存储到文件、数据库或通过网络传输。反序列化则是将字节流重新转换为对象的过程。通过实现java.io.Serializable接口,类可以被标记为可序列化的,该接口是一…...
Python解析Excel入库如何做到行的拆分
我们读取解析Excel入库经常会遇到这种场景,那就是行的拆分,如图: 比如我们入库,要以name为主键,可是表格name的值全是以逗号分割的多个,这怎么办呢?这就必须拆成多行了啊。 代码如下ÿ…...
信创国产化监控 | 达梦数据库监控全解析
达梦数据库(DM Database)是国产数据库的代表产品之一,在政府、金融、电信、能源等多个关键行业应用广泛,它具有高兼容性、高安全性、高可用性、高性能、自主可控等特点。随着国产化替代进程加速,达梦数据库在关键信息基…...
Parsec解决PnP连接失败的问题
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、准备环境二、DMZ三、端口映射1.Parsec设置固定端口2.路由器设置端口转发3.重启被控端Parsec四、多少一句1.有光猫管理员账号2.没有光猫管理员账号总结 前言…...
LLM笔记(二)LLM数据基础
核心目标: 构建 LLM 的数据基础,将原始文本转化为模型可处理的、包含丰富语义和结构信息的数值形式。 一、 环境与库准备 (Environment & Libraries): 必要库确认: 在开始之前,确保 torch (PyTorch深度学习框架) 和 tiktoken (OpenAI的高效BPE分词…...
让三个线程(t1、t2、t3)按顺序依次打印 A、B、C
public class ThreadWait {private static final Object lock = new Object();private static boolean t1Output=true;private static boolean t2Output=false;private static boolean t3Output=false;public static void main(String[] args) {//线程1new Thread(new Runnable…...
2、ubantu系统配置OpenSSH | 使用vscode或pycharm远程连接
1、OpenSSH介绍 OpenSSH(Open Secure Shell)是一套基于SSH协议的开源工具,用于在计算机网络中提供安全的加密通信。它被广泛用于远程系统管理、文件传输和网络服务的安全隧道搭建,是保护网络通信免受窃听和攻击的重要工具。 1.1…...
idea启动报错:java: 警告: 源发行版 11 需要目标发行版 11(亲测解决)
引起原因 idea的jdk没有替换干净 1.配置project file–Project Structrue–Project 2.配置Modules-Sources file–Project Structrue–Modules-Sources 改为jdk11 3.配置Modules-Dependencies file–Project Structrue–Modules-Dependencies...
Pycharm IDEA加载大文件时报错:The file size exceeds configured limit
解决方案:配置一下idea.properties文件 文件里面写入代码: idea.max.intellisense.filesize50000重启IDEA即可;...
视频分辨率增强与自动补帧
一、视频分辨率增强 1.传统分辨率增强方法 传统的视频分辨率增强方法主要基于插值技术。这些方法通过对低分辨率视频帧中已知像素点的分布规律和相邻像素之间的相关性进行分析,在两者之间插入新的像素点以达到增加视频分辨率的目的。例如,最近邻插值算…...
深度学习让鱼与熊掌兼得
通常,一个大的复杂的模型的loss会低,但是拟合方面不够,小的模型在拟合方面更好,但是loss高,我们可以通过深度学习来得到一个有着低loss的小模型 我们之前学过,peacewise linear可以用常数加上一堆这个阶梯型函数得到,然后因为peacewise linear可以逼近任何function,所以理论上…...
面试 Linux 运维相关问题
标题Q1Shell脚本是什么、它是必需的吗? Shell脚本是一种用于自动化执行命令行任务的脚本程序,通常运行在Unix/Linux系统的Shell环境中(如Bash)。它通过将多个命令、逻辑控制(如条件判断、循环)和系统功能整合到一个文…...
阿里巴巴 1688 数据接口开发指南:构建自动化商品详情采集系统
在电商行业数据驱动决策的趋势下,高效获取商品详情数据成为企业洞察市场、优化运营的关键。通过阿里巴巴 1688 数据接口构建自动化商品详情采集系统,能够快速、精准地采集海量商品信息。本文将从开发准备、接口分析、代码实现等方面,详细介绍…...
python的宫崎骏动漫电影网站管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
答题pk小程序道具卡的获取与应用
道具卡是答题PK小程序中必不可少的一项增加趣味性的辅助应用,那么道具卡是如何获取与应用的呢,接下来我们来揭晓答案: 一、道具卡的获取: 签到获取:在每日签到中签到不仅可获得当日的签到奖励积分,同时连…...
从零开始创建一个 Next.js 项目并实现一个 TodoList 示例
Next.js 是一个基于 React 的服务端渲染框架,它提供了很多开箱即用的功能,如自动路由、API 路由、静态生成、增量静态再生等。本文将带你一步步创建一个 Next.js 项目,并实现一个简单的 TodoList 功能。 效果地址 🧱 安装 Next.j…...
全面掌握JSR303校验:从入门到实战
一、JSR303校验简介 JSR303是Java EE 6中的一项规范,全称为"Bean Validation 1.0",它定义了一套基于注解的JavaBean校验机制。通过简单的注解,我们可以优雅地完成参数校验工作,避免在业务代码中编写大量的校验逻辑。 …...
「Java EE开发指南」如何使用MyEclipse的可视化JSF编辑器设计JSP?(二)
Visual JSF Designer(可视化JSF设计器)的目标是使创建JSF应用程序的特定于组件工作更容易可视化,在本教程中,您将使用可视化设计器设计JSF登录页面。您将学习如何: 创建一个JSF项目创建一个新的JSF页面设计JSF页面 该…...
Python 翻译词典小程序
一、概述 本工具是基于Python开发的智能翻译系统,采用有道词典进行翻译,并具有本地词典缓存以及单词本功能。 版本号:v1.0 (2025-05-15) 二、核心功能说明 1. 基础翻译功能 即时翻译:输入英文单词自动获取中文释义 词性识别&…...
kafka调优
以下是 Kafka 性能调优的核心策略与参数配置建议,综合生产环境和硬件层面的优化方案,覆盖生产者、消费者、Broker 三个关键组件: 一、生产者调优 批量发送优化 • batch.size:增大批量消息大小(默认 16KB,建…...
【hadoop】sqoop案例 hive->mysql
将temperature.log中的气象数据导入到Hive的temperature表中, 根据气象站id分组计算每个气象站30年来的*最高*气温, 然后将统计结果导出到MySQL当中。 思路: 1.在hive中创建表 2.数据导入到表中 3.计算后的结果写入另外的表 4.用sqoop导出…...
Git/GitLab日常使用的命令指南来了!
在 GitLab 中拉取并合并代码的常见流程是通过 Git 命令来完成的。以下是一个标准的 Git 工作流,适用于从远程仓库(如 GitLab)拉取代码、切换分支、合并更新等操作。 🌐 一、基础命令:拉取最新代码 # 拉取远程仓库的所…...
遗传算法求解旅行商问题分析
目录 一、问题分析 二、实现步骤 1)初始化种群 2)计算适应度 3)选择操作 4)交叉操作 5)变异操作 三、求解结果 四、总结 本文通过一个经典的旅行商问题,详细阐述在实际问题中如何运用遗传算法来进…...
【Hadoop】伪分布式安装
【Hadoop】伪分布式安装 什么是 Hadoop 伪分布式安装? Hadoop 伪分布式安装(Pseudo-Distributed Mode) 是一种在单台机器上模拟分布式集群环境的部署方式。它是介于 本地模式(Local Mode) 和 完全分布式模式…...
微服务概述
什么是微服务 微服务是一个架构方案,属于分布式架构的一种。 微服务提倡将模块以独立服务的方式独立管理,整个项目依靠多个小型的服务(单独进程)同时运作来支撑,单个服务只关注自己的业务实现并且有专业的团队进行开发。服务之间使用轻量的协议进行消息传送,并且对于单个…...
【网工】华为配置基础篇①
目录 ■华为设备登录配置 ■VLAN与VLANIF地址配置 ■DHCP配置命令 ■ACL访问控制列表配置 ■NAT地址转换配置 ■华为设备登录配置 <AR> system-view //进入系统模式 [AR]sysname Huawei //设备命名为Huawei [Huawei] telnet server enable //开启设备telnet功…...
React19源码系列之 Diff算法
在之前文章中root.render执行的过程,beginWork函数是渲染过程的核心,其针对不同类型的fiber进行不同的更新处理,在FunctionComponent(函数组件)中,会针对新旧fiber进行对比处理生成新fiber。因此此次就详细…...
华为2024年报:鸿蒙生态正在取得历史性突破
华为于2025年03月31日发布2024年年度报告。报告显示,华为经营结果符合预期,实现全球销售收入 8,621 亿元人民币,净利润 626 亿元人民币。2024 年研发投入达到 1,797 亿元人民币,约占全年收入的 20.8%,近十年累计投入的…...
如何在Firefox火狐浏览器里-安装梦精灵AI提示词管理工具
第一步:进入《梦精灵跨平台AI提示词管理工具》官网 梦精灵 跨平台AI提示词管理助手 - 官网梦精灵是一款专为AI用户打造的跨平台提示词管理插件,支持一键收藏、快速复制、智能分类等功能,适用于即梦、豆包、Kimi、DeepSeek等多个AI平台&…...
【鸿蒙开发】性能优化
语言层面的优化 使用明确的数据类型,避免使用模糊的数据类型,例如ESObject。 使用AOT模式 AOT就是提前编译,将字节码提前编译成机器码,这样可以充分优化,从而加快执行速度。 未启用AOT时,一边运行一边进…...
Makefile与CMake
一、Makefile 核心内容 1. Makefile 基础结构与工作原理 三要素: 目标(Target):要生成的文件或执行的操作(如可执行文件、清理操作)。依赖(Dependency):生成目标所需的…...
P8803 [蓝桥杯 2022 国 B] 费用报销
P8803 [蓝桥杯 2022 国 B] 费用报销 - 洛谷 题目描述 小明在出差结束后返回了公司所在的城市,在填写差旅报销申请时,粗心的小明发现自己弄丢了出差过程中的票据。 为了弥补小明的损失,公司同意小明用别的票据进行报销,但是公司财…...
11 web 自动化之 DDT 数据驱动详解
文章目录 一、DDT 数据驱动介绍二、实战 一、DDT 数据驱动介绍 数据驱动: 现在主流的设计模式之一(以数据驱动测试) 结合 unittest 框架如何实现数据驱动? ddt 模块实现 数据驱动的意义: 通过不同的数据对同一脚本实现…...
15:00开始面试,15:06就出来了,问的问题有点变态。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到4月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...
深入理解浏览器渲染引擎:底层机制与性能优化实战
现代浏览器背后是一个庞大而复杂的系统工程,渲染引擎作为核心模块之一,承担着从解析 HTML/CSS 到最终绘制页面的关键职责。本文将从底层机制出发,系统梳理渲染引擎(如 Blink)工作原理、V8 与渲染流程的协作方式&#x…...
【LeetCode 热题 100】56. 合并区间 —— 一文弄懂排序+遍历经典解法(附Python代码)
📌 题目链接 LeetCode 56. 合并区间 📖 一、引言:区间合并,刷题路上的绊脚石? 区间类问题是算法面试中常见的经典题型,尤其是“合并区间”问题,考察你对排序、区间重叠判断及边界处理的理解和编码能力。 很多同学在面对这题时,容易卡在: 什么时候两个区间算重叠?…...
使用Mathematica绘制Clifford奇异吸引子
Clifford Attractors 是一种由微分方程 生成的混沌吸引子,参数a,b,c,d不同会产生不同的分形图案。这类吸引子属于迭代函数系统,通过不断迭代参数方程来生成复杂的图形。其数学基础可能与 Clifford 代数或高维函数理论相关,例如 Clifford 代数…...
各个历史版本mysql/tomcat/Redis/Jdk/Apache下载地址
mysql 各版本下载地址: https://downloads.mysql.com/archives/community/ **************************************************************** tomcat 各版本下载地址: https://archive.apache.org/dist/tomcat/ ********************************…...