探索C/C++的奥秘之list
list和我们之前讲的东西都一样,list第二个参数是一个空间配置器,是一个内存池, 底层是一个带头双向循环列表。list可以重载[],但是效率太低了。
list的遍历不能使用下标+[],因为它的空间不是连续的,可以使用迭代器,也可以使用范围for。
#include<iostream>
#include<list>
using namespace std;
int main()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
list<int>::iterator it = lt.begin();
while (it != lt.end())
{
cout << *it << " ";
it++;
}
cout << endl;
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
return 0;
}
1. list的介绍及使用
1.1 list的介绍
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。
4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。
5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间 开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这 可能是一个重要的因素)
1.2 list的使用
list中的接口比较多,此处类似,只需要掌握如何正确的使用,然后再去深入研究背后的原理,已达到可扩展的能力。以下为list中一些常见的重要接口。list的头插和头删复杂度都为O(1)。
从string之后,position都变了,在string的部分都是用下标去插入,现在的位置都是迭代器,但是和vector还是有点区别的。比如下面的在第五个位置插入数据:
int main()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_front(10);
lt.push_front(20);
//如果要在第五个位置插入数据
//下面这种方法是不行的
//lt.insert(lt.begin() + 5, 10);
//因为vector是一个连续的物理空间,是支持+的,但是插入的代价比较大,数据要往后挪动。
//list和vector各有各的优缺点。
//list的物理空间不是连续的,可以支持+,但是代价比较大,库立面没有直接支持。
//只有一种方法
auto it = lt.begin();
for (size_t i = 0; i < 5; i++)
{
++it;
}
lt.insert(it, 100);
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
return 0;
}
这是vector和list的第一个差别,这种差别是迭代器的差别导致的,list的插入代价是很低的,把前后位置的指向关系改变一下就可以了,排序都写到算法里面去了。
还有一种插入的场景,就是找到一个值,在它的前面插入一个数据。list和vector都没有提供find接口。
对于vector来说用小于没有问题,但对于list来讲,迭代器中end()节点的地址不一定比begin()大, end()的节点是有效数据的下一个位置,也就是哨兵位。
list中的insert接口不存在迭代器失效的问题,比如我要在这个位置插入接点,没有扩容的问题,没有野指针的问题,没有位置改变的问题,因为不需要挪动数据。vector在这个位置插入之前有两大问题,第一大问题就是扩容,第二大问题就是插入这个数据之后,位置往后挪,它的位置意义都变了。
erase节点存在迭代器失效的问题,因为节点都没了。
算法中的find,找到就返回这个节点,找不到就返回end节点。
int main()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_front(10);
lt.push_front(20);
auto it = lt.begin();
it = find(lt.begin(), lt.end(), 3);
if (it != lt.end())
{
lt.insert(it, 3);
*it *= 100;
}
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
it = find(lt.begin(), lt.end(), 3);
if (it != lt.end())
{
lt.insert(it, 30);
*it *= 100;
}
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
return 0;
}
如果是erase的话,程序就会崩溃:
int main()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_front(10);
lt.push_front(20);
auto it = lt.begin();
it = find(lt.begin(), lt.end(), 3);
if (it != lt.end())
{
lt.insert(it, 3);
*it *= 100;
}
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
it = find(lt.begin(), lt.end(), 3);
if (it != lt.end())
{
lt.erase(it);
*it *= 100;
}
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
return 0;
}
如果要用erase删除list中的偶数:
int main()
{
list<int> lt;
lt.push_back(1);
lt.push_back(2);
lt.push_back(3);
lt.push_back(4);
lt.push_front(10);
lt.push_front(20);
auto it = lt.begin();
//如果要用erase删除list中的偶数:
while (it != lt.end())
{
if (*it % 2 == 0)
{
it = lt.erase(it);
}
else
{
++it;
}
}
for (auto e : lt)
{
cout << e << " ";
}
cout << endl;
return 0;
}
swap就是两个链表直接交换。
int main()
{
list<int> lt1;
lt1.push_back(1);
lt1.push_back(2);
lt1.push_back(3);
lt1.push_back(4);
list<int> lt2;
lt2.push_back(10);
lt2.push_back(20);
lt2.push_back(30);
lt2.push_back(40);
for (auto e : lt1)
{
cout << e << " ";
}
cout << endl;
for (auto e : lt2)
{
cout << e << " ";
}
cout << endl;
lt1.swap(lt2);
for (auto e : lt1)
{
cout << e << " ";
}
cout << endl;
for (auto e : lt2)
{
cout << e << " ";
}
cout << endl;
return 0;
}
容器都是通过迭代器区间去访问的,比如这有一个容器,想在这一段查找,给这个容器的区间查找这个val就可以了。
clear就是把我们的节点删掉等等这些情况。
list中sort的价值大不大,库里面也有一个sort,list中也提供了一个sort,有啥意义呢?编译报错了,有时候掉不调到库里面去了,就看这个库是谁的归属,那就是哪儿出错了,sort这个库用这个迭代器我们不能用,因为sort这个库里面用到一个,就一个点我们就知道了,sort是快排,快排不能用这个东西,因为快排要做过参数取中,参数取中选其中一个值的时候,选中间那个值或者选另外一个值的时候,我直接要选那个位置,快排不适合,就是那个链表没办法适应这个场景。
所以大家仔细再看,如果我们单看算法,这些算法的名字有一些差异,他这个是函数模板,但是他在这个名字上面很有讲究,它的名字就暗示了应该传什么迭代器,这里就要迁移出一个知识讲一讲,然后再结合这这个说,迭代器从他的功能的角度是会分类的,从功能上来说,分为单向、双向、随机。功能上是什么呢?单向就只能++,双向可以++也可以--,随机是可以++、--、也可以+,也可以-。
谁的迭代器就是典型的单向呢?单链表、哈希表。谁是双向迭代器呢?双向链表,其实也就是我们的list,还有map、set,也就是树。谁是随机迭代器呢?vector、string、双端队列deque。它这的名字就暗示了你用哪种算法,reverse就适合用双向,find就适合用单向,sort就适合用随机。这个地方对迭代器是一个隐式的分类,可以认为它是一个性质进行划分,这个性质跟容器的底层结构有关系。
谁可以调用这个sort算法呢,这个sort底层是快排,决定了他要用这个随机迭代器,随机是可以吊的,链表就不可以调,链表这里调就报错了,用这个算法就要看容器的迭代器到底是哪一种,能不能适应,我怎么知道我的容器是哪一种呢?这里是有说明的,它的迭代器的内容是什么,vector和string可以用这个逆置,随机迭代器可以认为是一个特殊的双向迭代器,随机迭代器满足双向的要求,满足单向的要求,,如果写这个,单向、双向、随机都可以用,写随机的就随机可以用,写双向的就双向、随机可以用,写单向的就单向、双向、随机都可以用。
set底层就是更复杂的迭代器,也就是树了,forward_list是单向迭代器,
排序应该用vector,不应该用list,vector的效率远高于list,
数据量越大,差距越大一些,list排序终究还是要慢不少。如果我们真的要数据排序,我们不应该用链表,链表访问数据相比vector毕竟还是慢,list底层用的是归并算法。所以说list的sort意义不大。
void test_op()
{
srand(time(0));
const int N = 1000000;
vector<int> v;
v.reserve(N);
list<int> lt1;
//list<int> lt2;for (int i = 0; i < N; ++i)
{
auto e = rand();
v.push_back(e);
lt1.push_back(e);
}
// 排序
int begin1 = clock();
sort(v.begin(), v.end());
int end1 = clock();
int begin2 = clock();
lt1.sort();
int end2 = clock();
printf("vector sort:%d\n", end1 - begin1);
printf("list sort:%d\n", end2 - begin2);
}
int main()
{
test_op();
return 0;
}
list的作用是当排序值比较小的时候,list排序才有价值。
void test_op()
{
srand(time(0));
const int N = 100000;
vector<int> v;
v.reserve(N);
list<int> lt1;
list<int> lt2;for (int i = 0; i < N; ++i)
{
auto e = rand();
lt2.push_back(e);
lt1.push_back(e);
}
// 拷贝到vector排序,排完以后再拷贝回来
int begin1 = clock();
// 先拷贝到vector
for (auto e : lt1)
{
v.push_back(e);
}
// 排序
sort(v.begin(), v.end());
// 拷贝回去
size_t i = 0;
for (auto& e : lt1)
{
e = v[i++];
}
int end1 = clock();
int begin2 = clock();
lt2.sort();
int end2 = clock();
printf("vector sort:%d\n", end1 - begin1);
printf("list sort:%d\n", end2 - begin2);
}int main()
{
test_op();
return 0;
}
我们可以区分迭代器的类型,区分迭代器的类型有点复杂,叫做迭代器的萃取,就可以分辨出迭代器的类型。
merge就是连个链表可以直接进行归并,归并有一个前提就是先有序,两个链表要先sort再merge,这里还有另外一个东西叫仿函数,比较的仿函数的概念,仿函数在优先级队列再讲。
这个接口的本质是去重,去重也是有前提的,也是要先排序, 如果不排序去重的话效率是很低的。
remove就是find加erase,remove就是直接可以删。remove唯一要注意的是如果这个值不存在会不会报错?
void text_x()
{
int myints[] = { 17,89,7,14 };
std::list<int> mylist(myints, myints + 4);
mylist.remove(890);
for (auto e : mylist)
{
cout << e << " ";
}
cout << endl;
}
int main()
{
text_x();
return 0;
}
相当于find,如果找到就删除了,没找到就啥也不干。
remove_if 也涉及到一个仿函数的问题。
这个接口可以把一个链表的内容转移到另一个,它的转移是直接把节点拿走,就比如说有一个a链表,有一个b链表,直接把a链表的节点取下来直接插入到b链表,相当于a链表删除了数据,b链表插入了数据,严格来说就是发生了转移。也可以转移到自己身上,但是别把范围区间重叠了。
int main()
{
int myints[] = { 17,89,7,14 };
std::list<int> mylist1, mylist2;
std::list<int>::iterator it;
for (int i = 1; i <= 4; ++i)
mylist1.push_back(i); // mylist1: 1 2 3 4
for (int i = 1; i <= 3; ++i)
mylist2.push_back(i * 10); // mylist2: 10 20 30
for (auto e : mylist1)
{
cout << e << " ";
}
cout << endl;
for (auto e : mylist2)
{
cout << e << " ";
}
cout << endl << endl;
it = mylist1.begin();
++it;
// points to 2
//全部转移
//mylist1.splice(it, mylist2);
//转移一个
//mylist1.splice(it, mylist2, ++mylist2.begin());
//部分转移
//mylist1.splice(it, mylist2, ++mylist2.begin(), mylist2.end());
//把后面的数据转移到第一个的前面
mylist1.splice(mylist1.begin(), mylist1, ++mylist1.begin(), mylist1.end());
for (auto e : mylist1)
{
cout << e << " ";
}
cout << endl;
for (auto e : mylist2)
{
cout << e << " ";
}
cout << endl;
return 0;
}
相关文章:
探索C/C++的奥秘之list
list和我们之前讲的东西都一样,list第二个参数是一个空间配置器,是一个内存池, 底层是一个带头双向循环列表。list可以重载[],但是效率太低了。 list的遍历不能使用下标[],因为它的空间不是连续的,可以使用…...
Linux第六讲:进程控制
Linux第六讲:进程控制 1.进程创建1.1回顾fork1.2写时拷贝 2.进程终止2.1exit与_exit 3.进程等待3.1进程等待的方法(wait和waitpid) 4.进程程序替换4.1自定义shell的编写4.1.1输出命令行提示符4.1.2获取用户输入的命令4.1.3命令行分析4.1.4指令…...
LabVIEW基于双通道FFT共轭相乘的噪声抑制
对于双通道采集的含噪信号,通过FFT获取复数频谱后,对第二通道频谱取共轭并与第一通道频谱相乘,理论上可增强相关信号成分并抑制非相关噪声。此方法适用于通道间信号高度相关、噪声独立的场景(如共模干扰抑制)。以下为L…...
疯狂安卓入门,crayandroid
系列文章目录 文章目录 系列文章目录第一组 ViewGroup 为基类帧布局约束布局 第二组 TextView 及其子类button时钟 AnalogClock 和 TextClock计时器 第三组 ImageView 及其子类第四组 AdapterView 及其子类AutoCompleteTextView 的功能和用法ExapndaleListViewAdapterViewFlipp…...
SQL Server查询计划操作符(7.3)——查询计划相关操作符(10)
7.3. 查询计划相关操作符 88)Sequence Project:该操作符通过对一个排序集合增加字段来进行计算。其基于一个或多个字段的值将其输入的数据行分成多个段,这样,该操作符每次输出一个段,这些字段显示为该操作符的参数。该…...
【Matlab仿真】如何解决三相交流信号源输出波形失真问题?
问题描述 如标题所示,在搭建simulink模型过程中,明明模型搭建的没有问题,但是输出的波形却不是理想的正弦波,影响问题分析。 问题分析 以三相交流信号源输出波形为例,输出信号理应为三相正弦量,但是仿真…...
[含文档+PPT+源码等]精品基于Python实现的校园小助手小程序的设计与实现
基于Python实现的校园小助手小程序的设计与实现背景,可以从以下几个方面进行阐述: 一、技术背景 1. Python与Django框架的优势 Python作为一种高级编程语言,以其简洁的语法、丰富的库和强大的社区支持,在Web开发领域得到了广泛…...
Nginx(基础安装+配置文件)
目录 一.Nginx基础 1.基础知识点 2.异步非阻塞机制 二.Nginx安装 2.1安装nginx3种方式 1.包管理工具安装(yum/apt) 2.本地包安装(rpm/dpkg) 3.源码编译安装 3.1 源码编译安装nginx流程(ubuntu) 1.…...
el-table中slot=“header“和#header的区别
在<el-table>中,自定义表头单元格内容,可以用<templat slot"header">或者<templat #header>插入自定义表头内容,但如果表头中含有变量,比如<template slot"header">{{name}}</tem…...
S19文件格式详解:汽车ECU软件升级中的核心镜像格式
文章目录 引言一、S19文件格式的起源与概述二、S19文件的核心结构三、S19在汽车ECU升级中的应用场景四、S19与其他格式的对比五、S19文件实例解析六、工具链支持与安全考量七、未来趋势与挑战结语引言 在汽车电子控制单元(ECU)的软件升级过程中,S19文件(也称为Motorola S-…...
鸿蒙跨平台框架ArkUI-X
01 引言 目前,移动端主流跨平台方案有Flutter、React Native、uni-app等等,还有刚推出不久的Compose-Multiplatform,真所谓是百花齐放。这些框架各有特点,技术实现各有差异,比如Flutter通过Dart编写的UI描述对接Flutte…...
群晖DS223 Docker搭建为知笔记
群晖DS223 Docker搭建为知笔记,打造你的专属知识宝库 一、引言 在数字化信息爆炸的时代,笔记软件成为了我们管理知识、记录灵感的得力助手。为知笔记,作为一款专注于工作笔记和团队协作的云笔记产品,以其丰富的功能和便捷的使用体…...
FPGA入门教程
引言 FPGA(Field-Programmable Gate Array,现场可编程门阵列)是一种灵活且强大的硬件设备,广泛应用于数字电路设计、信号处理、嵌入式系统等领域。与传统的ASIC(专用集成电路)不同,FPGA允许用户…...
DR和BDR的选举规则
在 OSPF(开放最短路径优先)协议中,DR(Designated Router,指定路由器) 和 BDR(Backup Designated Router,备份指定路由器) 的选举是为了在广播型网络(如以太网…...
无需环境,直接用 Docker 来启动你的 Python 项目
大家好 我是洪峰 想象这样一种场景,你写好了代码,准备部署在新的服务器上,这台服务器只有 Python2 和 Python3.6,没有你代码适配好的 Python3.12,那怎么办? 1、编译安装 Python,我不推荐这种方…...
STM32之BKP
VBAT备用电源。接的时候和主电源共地,正极接在一起,中间连接一个100nf的电容。BKP是RAM存储器。 四组VDD都要接到3.3V的电源上,要使用备用电池,就把电池正极接到VBAT,负极跟主电源共地。 TEMPER引脚先加一个默认的上拉…...
【08】单片机编程核心技巧:变量命名规范
【08】单片机编程核心技巧:变量命名规范 (基于单片机开发实践,适用于 C/C 语言) 📌 核心原则 1️⃣ 清晰性:通过前缀、后缀、大小写区分变量类型、作用域、数据宽度等。 2️⃣ 一致性:同一项…...
JVM、MySQL常见面试题(尽力局)
JVM篇 一.谈一谈JDK、JRE、JVM分别是什么,有什么联系? 1.JDK是Java工具包,里面包含了JRE、Javac编译器等。 2.JRE是java运行环境,里面包含了JVM、JavaSE标准库类等。 3.JVM是Java虚拟机,运行编译后的.class的文件&am…...
Pytorch 转向TFConv过程中的卷积转换
转换知识基础 图像中使用的卷积一般为,正方形卷积核针对一个同等面积邻域的,进行相乘后邻域叠加到中心,相当于考虑中心像素的周围信息,做了一定的信息融合。 卷积相关参数 卷积前: input c1 卷积中: kernel 卷积核 stride 步…...
基于LabVIEW的伺服阀高频振动测试闭环控制系统
为实现伺服阀在设定位置上下快速移动(1kHz控制频率)的振动测试目标,需构建基于LabVIEW的闭环控制系统。系统需满足高速数据采集、实时控制算法(如PID或自适应控制)、高精度电流驱动及传感器反馈处理等需求。结合用户提…...
QQuick3D-Camera的介绍
QQuick3D-Camera的介绍 Camera的概述 Camera类继承于 Node;Camera定义了怎样将一个3D场景(Scene)投影到2D的表面上;一个场景至少需要一个Camera来可视化其内容。 Camera 可以像场景中任何节点一样,被定位和旋转&…...
django下防御race condition漏洞(竞争型漏洞)
目录 竞争型漏洞 概念 常见类型及示例 环境搭建 编辑漏洞复现 ucenter/1/ ucenter/2/ ucenter/3/ ucenter/4/ 总结 悲观锁 乐观锁 竞争型漏洞 概念 竞争型漏洞,也称为竞态条件漏洞(Race Condition Vulnerability),…...
【测试框架篇】单元测试框架pytest(4):assert断言详解
一、前言 用例三要素之一就是对预期结果的断言。 何为断言?简单来说就是实际结果和期望结果去对比,符合预期就测试pass,不符合预期那就测试 failed。断言内容就是你要的预期结果。断言包含对接口响应内容做断言、也包含对落DB的数据做断言。…...
多视图几何--结构恢复--三角测量
三角测量 1. 核心公式推导 假设两个相机的投影矩阵为 P P P 和 P ′ P P′,对应的匹配图像点(同名点)为 ( u , v ) (u, v) (u,v) 和 ( u ′ , v ′ ) (u, v) (u′,v′),目标是求解三维点 X [ X x , X y , X z , 1 ] T X [X_x, X_y, X_z, 1]^T X…...
【大模型】WPS 接入 DeepSeek-R1详解,打造全能AI办公助手
目录 一、前言 二、WPS接入AI工具优势 三、WPS接入AI工具两种方式 3.1 手动配置的方式 3.2 Office AI助手 四、WPS手动配置方式接入AI大模型 4.1 安装VBA插件 4.1.1 下载VBA插件并安装 4.2 配置WPS 4.3 WPS集成VB 4.4 AI助手效果测试 4.5 配置模板文…...
⭐算法OJ⭐N-皇后问题 II【回溯剪枝】(C++实现)N-Queens II
⭐算法OJ⭐N-皇后问题【回溯剪枝】(C实现)N-Queens 问题描述 The n-queens puzzle is the problem of placing n n n queens on an n n n \times n nn chessboard such that no two queens attack each other. Given an integer n, return the num…...
解锁 AI 量化新境界:Qbot 携手 iTick
在量化投资的汹涌浪潮中,你是否渴望拥有一个强大且便捷的工具,助你乘风破浪,驶向财富的彼岸?如今,Qbot 与 iTick 强强联合,为广大投资者和开发者打造出一个前所未有的 AI 量化生态系统。 Qbot:量…...
vue2设置横向滚动指令
图片横向滑动展示效果 创建directives.js文件 // 横向列表拖拽 const draggleScrollX {inserted(el, binding) {let isDragging false;let startX 0;let scrollLeft 0;el.classList.add("draggle-horizontal");// 添加监听事件-鼠标按下const onMouseDown (eve…...
Git和GitHub基础教学
文章目录 1. 前言2. 历史3. 下载安装Git3.1 下载Git3.2 安装Git3.3 验证安装是否成功 4. 配置Git5. Git基础使用5.1 通过Git Bash使用5.1.1 创建一个新的仓库。5.1.1.1 克隆别人的仓库5.1.1.2 自己创建一个本地仓库 5.1.2 管理存档 5.2 通过Visual Studio Code使用 6. Git完成远…...
【Linux docker】关于docker启动出错的解决方法。
无论遇到什么docker启动不了的问题 就是 查看docker状态sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三个配置文件(可能是配置的时候格式错误):/etc/docker/daemon.json(如果存在…...
程序化广告行业(2/89):从程序化广告深挖数据处理技巧
程序化广告行业(2/89):从程序化广告深挖数据处理技巧 大家好!我一直希望能和大家在技术学习的道路上携手共进,这也是我写这一系列博客的初衷。上次我们一起学习了Python基础的数据处理知识,这次咱们借助一…...
第七课:Python反爬攻防战:Headers/IP代理与验证码
在爬虫开发过程中,反爬虫机制成为了我们必须面对的挑战。本文将深入探讨Python爬虫中常见的反爬机制,并详细解析如何通过随机User-Agent生成、代理IP池搭建以及验证码识别来应对这些反爬策略。文章将包含完整的示例代码,帮助读者更好地理解和…...
时序数据库TimescaleDB基本操作示例
好的!以下是使用 TimescaleDB 的 Java 示例(基于 JDBC,因为 TimescaleDB 是 PostgreSQL 的扩展,官方未提供独立的 Java SDK): 1. 添加依赖(Maven) <dependency><groupId&g…...
【CSS 】Class Variance Authority CSS 类名管理工具库
1.背景、什么是 CVA? Class Variance Authority (CVA) 是一个用于管理 CSS 类名 的工具库,特别适合在 React 或 Vue 等前端框架中使用。它可以帮助你更轻松地处理组件的 样式变体(Variants),比如按钮的不同状态&#…...
【Linux】36.简单的TCP网络程序
文章目录 1. TCP socket API 详解1.1 socket():打开一个网络通讯端口1.2 bind():绑定一个固定的网络地址和端口号1.3 listen():声明sockfd处于监听状态1.4 accept():接受连接1.5 connect():连接服务器 2. 实现一个TCP网络服务器2.1 Log.hpp - "多级日志系统"2.2 Daem…...
Win 转 MacBook Pro 踩坑指南
前言 Window 和 macOS 系统的差异还是很大的,我从 Thinkpad 转用 M1 的 Macbook pro 已经一年了,几乎没有任何不适应,整体感受那是真的牛👃,速度和续航惊艳到我了,同时开启 6个 vscode 加几十个浏览器标签…...
【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真(基于运放的电流模BGR)
【模拟CMOS集成电路设计】带隙基准(Bandgap)设计与仿真 前言工程文件&部分参数计算过程,私聊~ 一、 设计指标指标分析: 二、 电路分析三、 仿真3.1仿真电路图3.2仿真结果(1)运放增益(2)基准温度系数仿真(3)瞬态启动仿真(4)静态…...
手写一个Tomcat
Tomcat 是一个广泛使用的开源 Java Servlet 容器,用于运行 Java Web 应用程序。虽然 Tomcat 本身功能强大且复杂,但通过手写一个简易版的 Tomcat,我们可以更好地理解其核心工作原理。本文将带你一步步实现一个简易版的 Tomcat,并深…...
QT显示网页控件QAxWidget、QWebEngineView及区别
一.QT种显示网页控件QAxWidget 1.介绍 QAxWidget 属于 QtAxContainer 模块,ActiveX 是微软提出的一种组件对象模型(COM)技术,允许不同的软件组件在 Windows 操作系统上进行交互和集成。QAxWidget 为开发者提供了在 Qt 应用程序中…...
【AI智能体报告】开源AI助手的革命:OpenManus深度使用报告
一、引言:当开源智能体走进生活 2025年3月,MetaGPT团队用一场"开源闪电战"改写了AI Agent的竞争格局。面对商业产品Manus高达10万元的邀请码炒作,他们仅用3小时便推出开源替代品OpenManus,首日即登顶GitHub趋势榜。 …...
VS Code连接服务器教程
VS Code是什么 VS Code(全称 Visual Studio Code)是一款由微软推出的免费、开源、跨平台的代码编辑神器。VS Code 支持 所有主流操作系统,拥有强大的功能和灵活的扩展性。 官网:https://code.visualstudio.com/插件市场࿱…...
装饰器模式的C++实现示例
核心思想 装饰器设计模式是一种结构型设计模式,它允许动态地为对象添加额外的行为或职责,而无需修改其原始类。装饰器模式通过创建一个装饰器类来包装原始对象,并在保持原始对象接口一致性的前提下,扩展其功能。 装饰器模式的核…...
C 语言数据结构(二):顺序表和链表
目录 1. 线性表 2. 顺序表 2.1 概念及结构 2.1.1 静态顺序表(不常用) 2.1.2 动态顺序表(常用) 编辑 2.2 练习 2.2.1 移除元素 2.2.2 删除有序数组中的重复项 2.2.3 合并两个有序数组 2.3 顺序表存在的问题 3. 链表 …...
TDengine 服务无法启动常见原因
taosd 是 TDengine 的核心服务进程,如果无法启动将导致整个数据库无法使用,了解常导致无法启动的原因,可以帮你快速解决问题。 1. 如何查找日志 无法启动的原因记录在日志中,日志文件默认在 /var/log/taos 的 taosdlog.0 或者 t…...
在 UniApp 中实现stream流式输出 AI 聊天功能,AI输出内容用Markdown格式展示
在 UniApp 中实现流式 AI 聊天功能 介绍 在现代 Web 开发中,流式 API 响应能够显著提升用户体验,尤其是在与 AI 聊天接口进行交互时。本文将介绍如何在 UniApp 中使用 Fetch API 实现一个流式响应的 AI 聊天功能,包括实时更新聊天内容和滚动…...
数据库SQL的配置和练习题
一、MySQL的安装 1.安装包下载 下载地址:https://downloads.mysql.com/archives/community/ 2.解压软件包 将MySQL软件包解压在没有中文和空格的目录下 3.设置配置文件 在解压目录下创建my.ini文件并添加内容如下: [client] #客户端设置&…...
Pytorch的一小步,昇腾芯片的一大步
Pytorch的一小步,昇腾芯片的一大步 相信在AI圈的人多多少少都看到了最近的信息:PyTorch最新2.1版本宣布支持华为昇腾芯片! 1、 发生了什么事儿? 在2023年10月4日PyTorch 2.1版本的发布博客上,PyTorch介绍的beta版本…...
AI+办公 Task1
作业 题目1:提示词除了三要素“角色”、“背景”、“要求”之外,还有哪些关键要素 提示词有一个框架叫CO-STAR框架,还有的关键要素有风格、任务、响应格式等。 要素适用场景实际案例Context需要限定领域或场景的任务"作为医学助手&…...
文件系统调用─── linux第17课
目录 linux 中man 2和man 3的区别 文件内容介绍 C语言文件接口 示例: 输出信息到显示器,你有哪些方法 总结: 系统文件I/O 文件类的系统调用接口介绍 示例 open 函数具体使用哪个,和具体应用场景相关, write read close lseek ,类比C文件相关接…...
概念|RabbitMQ 消息生命周期 待消费的消息和待应答的消息有什么区别
目录 消息生命周期 一、消息创建与发布阶段 二、消息路由与存储阶段 三、消息存活与过期阶段 四、消息投递与消费阶段 五、消息生命周期终止 关键配置建议 待消费的消息和待应答的消息 一、待消费的消息(Unconsumed Messages) 二、待应答的消息…...