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

C++初阶-迭代器失效和vector::insert函数的最终实现

目录

1.vector::insert函数

1.1问题分析

1.2vector::insert函数的最终实现

1.3vector::insert函数的分析

2.第二种迭代器失效

3.第三种迭代器失效

4.迭代器失效deepseek的回答

1. 迭代器失效的原因

2. 不同容器的迭代器失效情况

(1)std::vector

(2)std::deque

(3)std::list / std::forward_list

(4)std::map / std::set(及 unordered_ 版本)

3. 如何避免迭代器失效?

(1)更新迭代器

(2)使用索引替代迭代器

(3)先收集再删除

(4)谨慎使用 reserve / rehash

4. 总结

5.总结


1.vector::insert函数

我们测试一下这个函数:

void func(const td::vector<int>& v)
{for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;
}
void test()
{vector<int> v1; v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);func(v1);v1.insert(v1.begin(), 10);func(v1);v1.erase(v1.begin() + 3);func(v1);
}

那么运行结果为:

如果我们把代码改为如下形式:

void test()
{vector<int> v1; v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);v1.push_back(5);func(v1);v1.insert(v1.begin(), 10);func(v1);v1.erase(v1.begin() + 3);func(v1);
}

则运行结果为:

也就是说insert函数是一定有问题的,这个需要我们调试分析一下代码:

1.1问题分析

我们发现在经过这个reserve后_start地址改变了,而这个pos地址不变,也就是说pos指向旧空间,但reserve函数在调用时会释放旧空间,it是_finish-1,而pos还是旧空间,在循环时一直判断it>=pos,那么就不会结束,会造成越界。

这种情况就是迭代器失效,pos指向旧空间,但扩容导致迭代器失效,本质上就是野指针了。

所以我们应该这样写:

1.2vector::insert函数的最终实现

//insert函数的实现2
void insert(iterator pos, const T& x)
{//判断是否合法assert(pos >= _start);assert(pos <= _finish);//判满if (_finish == _end_of_storage){size_t len = pos - _start;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _start + len;}iterator it = _finish - 1;//移动数据while (it >= pos){*(it + 1) = *it;--it;}*pos = x;++_finish;
}

1.3vector::insert函数的分析

这是一个比较浅的迭代器失效的问题,但是这里也提醒我们了一个很重要的点:需要注意函数调用后可能会导致迭代器失效的问题。

2.第二种迭代器失效

我们看如下代码:

void test()
{vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);int i;cin >> i;auto it = v1.begin() + 1;v1.insert(it, 10);cout << *it << endl;
}

那么运行结果为:

不管我们输入0-3中的任意数字,最终打印结果一定不是最终值,这是因为再进行插入,那么最终会导致扩容,而扩容导致原地址失效,导致it为野指针,这个it的类型可以写为:td::vector<int>::iterator,所以导致了打印结果不正确。且insert是否扩容是不确定的,无法判断是否有迭代器失效。

那如果我们把insert改为如下定义:

void insert(iterator& pos, const T& x)
{//判断是否合法assert(pos >= _start);assert(pos <= _finish);//判满if (_finish == _end_of_storage){size_t len = pos - _start;reserve(capacity() == 0 ? 4 : capacity() * 2);pos = _start + len;}iterator it = _finish - 1;//移动数据while (it >= pos){*(it + 1) = *it;--it;}*pos = x;++_finish;
}

也就是说我们把第一个形参改为引用,这样就可以了吗?

用如下函数测试:

void test()
{vector<int> v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);int i;cin >> i;auto it = v1.begin() + 1;//不行v1.insert(it + 1, 10);//不行v1.insert(v1.begin(), 10);cout << *it << endl;
}

那么会有两个报错:

所以我们不能这样写!

所以我们最终解决办法就只能是再创建一个迭代器,否则很容易出错!

3.第三种迭代器失效

int main()
{std::vector<int>v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);auto it = v1.begin();while (it != v1.end()){if (*it % 2 == 0){v1.erase(it);}++it;}for (const auto& e : v1){cout << e << " ";}cout << endl;return 0;
}

那么运行结果为:

首先声明一下:这里的是库里面的函数,而且如果测试都是没有其他问题的,但是如果你打印也会有问题。

为什么用erase也会失效?

首先我们若遇到偶数,判断出2为偶数,但是v1会直接跳过3的位置去判断下一个位置了,所以会导致结果不准确,然后最终非法访问?

那么我们改代码为如下形式:

int main()
{std::vector<int>v1;v1.push_back(1);v1.push_back(2);v1.push_back(3);v1.push_back(4);auto it = v1.begin();while (it != v1.end()){if (*it % 2 == 0){v1.erase(it);}else{++it;}}for (const auto& e : v1){cout << e << " ";}cout << endl;return 0;
}

为什么还是会有问题(这个取决于编译器,在g++下是运行正确的)?

这个取决于编译器,VS会认为erase、insert后的迭代器是失效的。可以任务迭代器有个标记,在经过这些过程后会改变标记,因为这是一个更加严格的检查!而在不同的编译器可能运行结果是不同的,所以我们在之后的学习中要把一段程序在多个编译器运行,保证它在每个编译器都能运行

但是也要注意:erase在多数编译器中会只挪动数据,但有些编译器可能为了节省空间而缩容,所以单单erase也可能导致野指针!

结论:erase(it)以后,不同平台实现有差异,但是我们统一认为it失效了!我们在用完了一个后需要进行迭代器的更新!

4.迭代器失效deepseek的回答

通过deepseek我们可以更加深入的了解迭代器失效的问题,也方便了我们之后避免此类问题。以下是deepseek的搜索结果:

在 C++ 中,迭代器(iterator) 是指向容器(如 vectorlistmap 等)元素的抽象指针。但某些操作会导致迭代器失效(invalidated),即它不再指向有效的元素,继续使用会导致未定义行为(UB),如程序崩溃或数据错误。


1. 迭代器失效的原因

迭代器失效通常发生在容器结构被修改时,例如:

  • 插入元素insertpush_backemplace 等)

  • 删除元素erasepop_backclear 等)

  • 容器扩容(如 vector 的 reserve 或自动增长)

失效的根本原因是:

  • 内存重新分配(如 vector 扩容,旧迭代器指向被释放的内存)

  • 元素位置移动(如 vector 插入/删除导致后续元素位移)

  • 数据结构变化(如 unordered_map 的 rehash)


2. 不同容器的迭代器失效情况

不同容器对迭代器失效的敏感程度不同:

(1)std::vector

操作迭代器失效情况
push_back / emplace_back可能失效(如果触发扩容,所有迭代器失效;否则仅 end() 失效)
insert / emplace可能失效(插入点及之后的迭代器失效,如果扩容则全部失效)
erase被删元素及之后的迭代器失效
pop_back仅 end() 失效
clear / resize所有迭代器失效
reserve不影响现有迭代器(除非 capacity 改变)

示例:

std::vector<int> v = {1, 2, 3};
auto it = v.begin() + 1; // 指向 2
v.push_back(4);          // 可能扩容,it 失效!
// std::cout << *it;     // 未定义行为(UB)!

(2)std::deque

操作迭代器失效情况
push_back / push_front通常不影响现有迭代器(除非重新分配)
insert / emplace所有迭代器失效
erase被删元素及之后的迭代器失效
pop_back / pop_front仅被删元素的迭代器失效
clear所有迭代器失效

特点

  • deque 是分段连续存储,头尾插入通常不影响中间迭代器。

  • 但 insert 可能导致所有迭代器失效(因为可能重新分配)。


(3)std::list / std::forward_list

操作迭代器失效情况
push_back / push_front不影响现有迭代器
insert / emplace不影响其他迭代器
erase仅被删元素的迭代器失效
pop_back / pop_front仅被删元素的迭代器失效
clear所有迭代器失效

特点

  • list 是双向链表forward_list 是单向链表

  • 插入/删除只影响当前节点,其他迭代器仍然有效。

示例:

std::list<int> l = {1, 2, 3};
auto it = ++l.begin(); // 指向 2
l.erase(it);           // it 失效,但其他迭代器仍然有效

(4)std::map / std::set(及 unordered_ 版本)

操作迭代器失效情况
insert / emplace不影响现有迭代器
erase仅被删元素的迭代器失效
clear所有迭代器失效

特点

  • 基于红黑树map/set)或哈希表unordered_map/unordered_set)。

  • 插入/删除通常不影响其他迭代器(除非 rehash,如 unordered_map 扩容)。

unordered_map 的 rehash 问题:

std::unordered_map<int, int> m;
auto it = m.begin();
m.reserve(1000); // 可能触发 rehash,it 失效!
// std::cout << it->first; // UB!

3. 如何避免迭代器失效?

(1)更新迭代器

某些操作(如 erase)会返回新的有效迭代器

std::vector<int> v = {1, 2, 3};
auto it = v.begin() + 1;
it = v.erase(it); // it 现在指向 3(原 2 被删)

(2)使用索引替代迭代器

vector 可以用 [] 或 at() 访问:

std::vector<int> v = {1, 2, 3};
size_t idx = 1;
v.erase(v.begin() + idx); // 用索引计算新迭代器

(3)先收集再删除

避免在循环中直接删除:

std::vector<int> v = {1, 2, 3, 4, 5};
std::vector<int> to_remove = {2, 4};
for (auto val : to_remove) {v.erase(std::remove(v.begin(), v.end(), val), v.end());
}

(4)谨慎使用 reserve / rehash

vector / unordered_map 扩容会导致所有迭代器失效

std::vector<int> v = {1, 2, 3};
auto it = v.begin();
v.reserve(100); // 可能扩容,it 失效!

4. 总结

容器插入操作删除操作扩容/rehash
vector可能失效可能失效全部失效
deque通常安全部分失效可能失效
list安全仅当前失效不适用
map/set安全仅当前失效不适用
unordered_map安全仅当前失效全部失效(rehash)

最佳实践:

  • vector:小心 push_back / insert / erase,尽量用索引。

  • list / map:插入/删除较安全,但 erase 后别用旧迭代器。

  • unordered_map:注意 reserve / rehash 导致失效。

理解迭代器失效机制,能避免很多隐藏的 UB(未定义行为)问题!

5.总结

这讲内容比较简单,但是还是说明我们也需要进行判断自己的迭代器是否会失效,这也是比较重要的知识。

下节将继续讲解vector的模拟实现的内容。好了,这讲结束了,喜欢的可以一键三连哦!下节再见!

相关文章:

C++初阶-迭代器失效和vector::insert函数的最终实现

目录 1.vector::insert函数 1.1问题分析 1.2vector::insert函数的最终实现 1.3vector::insert函数的分析 2.第二种迭代器失效 3.第三种迭代器失效 4.迭代器失效deepseek的回答 1. 迭代器失效的原因 2. 不同容器的迭代器失效情况 &#xff08;1&#xff09;std::vecto…...

DeepSeek的走红,会不会带动芯片市场新一轮增长?

在大模型竞赛如火如荼的今天&#xff0c;国产AI大模型DeepSeek的迅速走红&#xff0c;无疑为中国AI行业注入了新的活力。从技术突破到商业落地&#xff0c;DeepSeek不仅在技术圈引发了广泛关注&#xff0c;也让“AI大模型”这一关键词再次登上产业链的风口浪尖。但一个更值得深…...

小土堆pytorch--神经网路-卷积层池化层

神经网路-卷积层&池化层 一级目录二级目录三级目录 1. 神经网路-卷积层2. 神经网路最大池化的应用 一级目录 二级目录 三级目录 1. 神经网路-卷积层 在PyTorch中&#xff0c;torch.nn.Conv2d函数定义了一个二维卷积层&#xff0c;其常用参数包括&#xff1a; in_channel…...

什么叫生成式人工智能?职业技能的范式转移与能力重构

当人们谈论人工智能时&#xff0c;常常混淆其不同类型与功能。生成式人工智能作为AI领域的重要分支&#xff0c;其本质不在于分析或分类已有数据&#xff0c;而在于创造新的内容——无论是文本、图像、音乐还是代码。理解这一技术的内涵&#xff0c;不仅关乎技术认知&#xff0…...

集星獭 | 重塑集成体验:新版编排重构仿真电商订单数据入库

概要介绍 新版服务编排以可视化模式驱动电商订单入库流程升级&#xff0c;实现订单、客户、库存、发票、发货等环节的自动化处理。流程中通过循环节点、判断逻辑与数据查询的编排&#xff0c;完成了低代码构建业务逻辑&#xff0c;极大提升订单处理效率与业务响应速度。 背景…...

小白成长之路-Linux磁盘管理(一)

文章目录 前言一、磁盘介绍1、磁盘的物理结构1.1硬盘结构1.2磁头数、磁道、柱面、扇区 2.CHS编号2.1磁道编号规则2.3扇区编号规则2.3通过CHS计算硬盘容量 3、磁盘存储划分3.1第一个扇区存储的数据3.2硬盘分区 4.开机流程5、要点6、磁盘存储数据的形式 二、Linux文件系统1、根文…...

【Linux】第二十四章 管理网络安全

1. 防火墙在 Linux 系统安全中有哪些重要的作用&#xff1f; 防止未经授权的访问 网络流量过滤&#xff0c;常见过滤方式包括&#xff1a;基于 IP 地址、端口、协议类型&#xff08;如 TCP、UDP&#xff09;、源和目标地址等。限制流量速率、阻止来自单个IP或多个IP的高频请求保…...

【解决】SSH 远程失败之路由配置问题

开发平台&#xff1a;RedHat 8   一、问题描述 使用 WindTerm SSH 远程连接 192.168.88.211 虚拟主机&#xff0c;无法连接。   二、问题追溯 VMWare 虚拟机配置 虚拟网卡IPVMNet 模式应用网卡1&#xff08;eth0&#xff09;192.168.88.11/24VMNet 8服务网卡2&#xff08;…...

中级网络工程师知识点9

1.在Linux中&#xff0c;负责配置DNS的文件是/etc/resolv.conf&#xff0c;包含了主机的域名搜索顺序和DNS服务器的地址 2.主域名服务器在接收到域名请求后&#xff0c;首先查询的是本地缓存 3.自动专用地址&#xff1a;169.254.X.X/16 4.FTP默认20端口&#xff0c;传输文件…...

网页前端开发(基础)

前端开发三件客&#xff1a;HTML&#xff0c;CSS&#xff0c;JavaScript。 web标准&#xff0c;也称网页标准&#xff0c;由3个组成部分。1.HTML,管理页面的元素和内容。2.CSS&#xff0c;负责网页的表现&#xff08;页面元素的外观&#xff0c;位置等页面样式。如&#xff1a;…...

Git命令使用全攻略:从创建分支到合并的完整流程

Git命令使用全攻略&#xff1a;从创建分支到合并的完整流程 引言一、初始化项目与基础配置1.1 克隆远程仓库1.2 查看当前分支状态 二、创建与管理分支2.1 从main分支创建新功能分支2.2 查看分支列表2.3 提交代码到新分支2.4 推送分支到GitHub 三、版本发布与标签管理3.1 创建轻…...

边缘智能与量子计算双轮驱动:IVX 开启实时 AI 开发新维度

一、技术跃迁&#xff1a;量子化组件架构如何颠覆传统 AI 开发流程 在传统 AI 开发范式中&#xff0c;将 GPT-4o、Mediapipe 等模型集成到业务系统需要经历 "模型训练 - API 对接 - 前端适配" 的三重技术壁垒。开发团队需同时掌握 TensorFlow、Flask、React 等技术栈…...

对冲策略加仓止损盈思路

外汇交易中的对冲策略&#xff0c;重点在于加仓和盈利出局的策略。该策略通过多种方法来管理头寸&#xff0c;旨在最大化盈利并控制风险。 加仓策略 金字塔加仓法 金字塔加仓法是一种逐步增加头寸的方法。在初始头寸盈利后&#xff0c;以较小的手数逐步增加头寸。这种方法可以在…...

ERP生产环境索引重建:高风险操作还是性能良药?何时动手,如何操刀?

ERP系统是企业运营的核心,其数据库性能至关重要。索引作为提升查询效率的关键,其维护(尤其是重建)操作却常常让DBA和运维工程师们如履薄冰。本文将深入探讨在生产ERP环境中重建索引的潜在风险、必要性评估、最佳实践以及不同数据库的注意事项,旨在帮助技术人员做出明智决策…...

PyTorch 之 torch.distributions.Categorical 详解

PyTorch 之 torch.distributions.Categorical 详解 PyTorch 之 torch.distributions.Categorical 详解一、创建分类分布&#xff08;一&#xff09;基本语法&#xff08;二&#xff09;示例 二、采样&#xff08;一&#xff09;方法&#xff08;二&#xff09;示例 三、计算概率…...

杰发科技AC7840——如何把结构体数据写到Dflash中

1. 结构体数据被存放在Pflash中 正常情况下&#xff0c;可以看到全局变量的结构体数据被存放在Pflash中 数字部分存在RAM中 2. 最小编程单位 8字节编程&#xff0c;因此如果结构体存放在Dfalsh中&#xff0c;进行写操作&#xff0c;需要写8字节的倍数 第一种办法&#xff1a;…...

vue路由小案例

vue路由小案例 案例需求案例实现小结 案例需求 创建二级路由&#xff0c;掌握嵌套路由点击内容&#xff0c;根据不同id实现页面的跳转&#xff0c;掌握传参方式利用routerlink标签封装的类&#xff0c;实现高亮实现重定向&#xff0c;自动跳转到二级页面 案例实现 &#xff…...

链表面试题9之环形链表进阶

那么上一题我们已经知道了双指针的变法以及拓展的用法&#xff0c;那么这里我们直接难度升级。 想回去复习的这里放个链接&#xff1a;链表的面试题8之环形链表-CSDN博客 题目链接&#xff1a;142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 我们来看这道题目主要…...

CentOS 7上BIND9配置DNS服务器指南

详细说明如何在 CentOS 7 上配置 BIND9 扮演这四种不同的 DNS 角色&#xff0c;包括配置文件示例和注意事项。 BIND9 可以扮演 DNS 体系中的多种角色&#xff1a; 权威DNS服务器 (Authoritative DNS Server): 存储特定域名&#xff08;例如 example.com&#xff09;的官方DNS记…...

Pytorch针对不同电脑配置详细讲解+安装(CPU)

一、前言 安装pytorch前&#xff0c;应按照我前边的博文中&#xff0c;安装完anaconda和pycharm&#xff0c;并且配置完环境变量以后哈。 Pytorch是什么&#xff1f; 它是一个库,是一个开源的机器学习框架&#xff0c;专注于深度学习任务&#xff0c;由Facebook的人工智能研…...

知识体系_数据分析挖掘_基尼系数

1 概述 基尼系数(gini coefficient)表示在全部居民收入中,用于进行不平均分配的那部分收入占总收入的百分比。社会中每个人的收入都一样、收入分配绝对平均时,基尼系数是0;全社会的收入都集中于一个人、收入分配绝对不平均时,基尼系数是1。现实生活中,两种情况都不可能发…...

Fiddler抓包教程->HTTP和HTTPS基础知识

1.简介 有的伙伴可能会好奇&#xff0c;不是讲解和分享抓包工具,怎么这里开始讲解HTTP和HTTPS协议了。这是因为你对HTTP协议越了解&#xff0c;你就能越掌握Fiddler的使用方法&#xff0c;反过来你越使用Fiddler&#xff0c;就越能帮助你了解HTTP协议。 Fiddler无论对开发人员…...

超级维特根斯坦

AI智能体核心指令:语言智慧融合体 - 深度思辨、专业应用与协同创新大师 1. 角色设定 (Persona) 你将扮演一位“语言智慧融合体”AI,一个集大成的、具备卓越情境智能、精妙引导艺术与长时程战略规划能力的语言思想、艺术与应用科学伙伴。你的核心人格与方法论基于以下杰出贡…...

探索付费社群的成功之道:生财与群响的深度解析

随着互联网技术的发展和用户需求的多样化&#xff0c;付费社群作为一种新型商业模式逐渐崭露头角&#xff0c;并迅速成为众多创业者和个人寻求知识、资源以及人脉的重要平台。本文将深入探讨两个成功的付费社群——生财和群响&#xff0c;分析它们如何在各自领域内取得显著成就…...

【b站计算机拓荒者】【2025】微信小程序开发教程 - 3 项目目录结构

3 项目目录结构 3.1 项目目录结构 3.1.1 目录介绍 # 1 项目主配置文件&#xff0c;在项目根路径下&#xff0c;控制整个项目的-app.js # 小程序入口文件&#xff0c;小程序启动&#xff0c;会执行此js-app.json # 小程序全局配置文件&#xff0c;配置小程序导航栏颜色等信息…...

TuyaOpen横空出世!涂鸦智能如何用开源框架重构AIoT开发范式?

🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引子:AIoT开发的“不可能三角”被打破 当AI与物理世界深度融合的浪潮席卷全球,开发者们却始终面临一个“不可能三角”——开发效率、技术深度与商业化落地难以兼得。 …...

物联网(IoT)智能项目全景指南:技术构架、实现细节与应用实践

目录 一、物联网项目的核心组成和发展方向 1. 核心组成 2. 发展趋势 二、系统设计的详细流程 1. 需求分析与方案规划 2. 硬件方案深度设计 3. 软件架构设计 4. 方案示意图&#xff08;架构图&#xff09; 三、关键技术深度剖析 1. 传感器及其接口技术 2. 嵌入式MCU选…...

【c# 类型转换中 as 和()】

在 C# 中&#xff0c;as 关键字和强制类型转换&#xff08;()&#xff09;都用于对象类型的转换&#xff0c;但它们在语法、行为和用途上有显著的区别。 1. 语法区别 强制类型转换&#xff08;()&#xff09; 语法&#xff1a;(TargetType)expression用途&#xff1a;将一个…...

Elasticsearch 实战面试题,每个题目都会单独解析

Elasticsearch 在 Java 中最常用的客户端是什么&#xff1f;如何初始化一个 RestHighLevelClient&#xff1f;如何用 Spring Boot 快速集成 Elasticsearch&#xff1f;Spring Data Elasticsearch 如何定义实体类与索引的映射&#xff1f; ES的倒排索引和正排索引的区别及适用场…...

01-通过纯js理解数据驱动图表概念

现有1组一维数组数据&#xff1a; const data [720, 320, 531, 120, 230, 387, 258] 通过forEach循环该data&#xff0c;根据数据值&#xff0c;循环出对应长度的 rect 标签&#xff0c;计算好横纵坐标的位置&#xff0c;并在最后将各个 rect标签 append 到 svg 标签中。如图所…...

Java DTO 深度解析

一、什么是DTO&#xff1f; DTO&#xff08;Data Transfer Object&#xff09; 是一种用于在不同层&#xff08;如Controller层、Service层&#xff09;之间传输数据的对象设计模式。其核心目的是封装数据&#xff0c;减少网络传输开销&#xff0c;同时避免直接暴露领域模型&a…...

Python、Pytorch、TensorFlow、Anconda、PySide、Jupyter

一、Python Python是一种高级、通用、解释型的开源编程语言,由Guido van Rossum于1990年代初设计。它具有以下显著特点: 1‌.语言特性‌ (1) 语法简洁易读,接近自然语言(如print(“Hello World!”)) (2) 采用强制缩进而非大括号定义代码块 (3) 支持面向对象、函数式和过…...

视频监控联网系统GB28181协议中互联结构详解

文章目录 4.1 SIP 监控域互联结构4.1.1 概述4.1.2 区域内联网4.1.3 跨区域联网4.1.4 联网方式4.1.4.1 级联4.1.4.2 互联 4.2 SIP 监控域与非 SIP 监控域互联结构4.2.1 概述4.2.2 控制协议网关4.2.3 媒体网关 智联视频超融合平台介绍 4.1 SIP 监控域互联结构 4.1.1 概述 联网系…...

系统编程的标准IO

标准IO 头文件需求&#xff1a; #include <stdio.h>1.fopen和fclose (1)fopen fopen的函数功能是打开一个文件。 首先看看fopen的函数声明&#xff1a; FILE *fopen(const char *path, const char *mode);第一个参数path是文件地址&#xff0c;传入的是不可变的字符…...

windows安装WS,实测可行

参考链接 1、 wsl -l -v 查看哪些ubuntu环境在运行 2、wsl -t Ubuntu 停止当前的Ubuntu 3、wsl --install -d Ubuntu-22.04 下载ubunt 4、wsl --unregister Ubuntu-22.04 移除ubuntu 5、wsl --export Ubuntu-22.04 F:\Ubuntu-22.04\Ubuntu-22.04.tar 导出 Ubuntu-22.04 为 .ta…...

【蓝桥杯真题精讲】第 16 届 Python A 组(省赛)

文章目录 T1 偏蓝 (5/5)T2 IPv6 (0/5)T3 2025 图形 (10/10)T4 最大数字 (10/10)T5 倒水 (15/15)T6 拼好数 (0/15)T7 登山 (20/20)T8 原料采购 (20/20) 更好的阅读体验 高速访问&#xff1a;https://wiki.dwj601.cn/ds-and-algo/lan-qiao-cup/16th-python-a/永久链接&#xff1…...

栈和队列的模拟实现

栈和队列的模拟实现 容器适配器priority_queue(优先级队列&#xff09;priority_queue的使用priority_queue的模拟实现&#xff1a; 仿函数什么叫仿函数&#xff1f;需要自己实现仿函数的情况&#xff1a; 栈的模拟实现队列的模拟实现deque&#xff08;vector和list的缝合怪&am…...

python学习day3

1比较运算符号&#xff08;生成布尔类型&#xff09; print(98大于90吗,98>90) print(98小于90吗,98<90) print(98等于90吗,9890) print(98不等于90吗,98!90)2逻辑运算符号 print(8>7 and 6>5) print(9>8 and 7<5) print(8<7 and 10/0) #当第一个表达式结…...

Java转Go日记(四十二):错误处理

1.1.1. 错误处理 执行任何操作后&#xff0c;如果发生任何错误&#xff0c;GORM将其设置为*DB的Error字段 if err : db.Where("name ?", "jinzhu").First(&user).Error; err ! nil {// 错误处理...}// 如果有多个错误发生&#xff0c;用GetErrors获…...

考研系列-408真题计算机组成原理篇(2020-2023)

写在前面 此文章是本人在备考过程中408真题计算机组成原理部分(2020年-2023年)的易错题及相应的知识点整理,后期复习也常常用到,对于知识提炼归纳理解起到了很大的作用,分享出来希望帮助到大家~ # 2020年 1.机器字长相关 指令字长和机器字长没有明确的关系,但是一般来说…...

经典面试题:TCP 三次握手、四次挥手详解

在网络通信的复杂架构里&#xff0c;“三次握手”与“四次挥手”仿若一座无形的桥梁&#xff0c;它们是连接客户端与服务器的关键纽带。这座“桥梁”不仅确保了连接的稳固建立&#xff0c;还保障了连接的有序结束&#xff0c;使得网络世界中的信息能够顺畅、准确地流动。 在面…...

Raft算法学习(1)博士论文大纲

参考资料 原文一共257页&#xff0c;其中前六章为算法重点介绍&#xff0c;第七章有点像A/B TEST 论文标题&#xff1a; 共识&#xff1a;连接理论与实践 (CONSENSUS: BRIDGING THEORY AND PRACTICE) 作者&#xff1a; Diego Ongaro 日期&#xff1a; 2014年8月 机构&#xff…...

PDF处理控件Aspose.PDF教程:以编程方式将 PDF 导出为 JPG

在本节中&#xff0c;我们将探讨如何使用 Aspose.PDF 库将 PDF 文档转换为 JPG 图像。Aspose.PDF 是一个功能强大且用途广泛的库&#xff0c;专为需要以编程方式处理 PDF 文件的开发人员而设计。它提供了丰富的功能&#xff0c;可用于跨多个平台创建、编辑和转换 PDF 文档。其主…...

记录一下flutter项目自己封窗的弹窗

在评委项目开发中我使用到的弹窗dialog与modal sheet底部弹出组件&#xff0c;我对其进行了基础的封装&#xff0c;以适用于本项目&#xff0c;代码如下&#xff1a; class JudgeDialog {// 内容边距static EdgeInsetsGeometry _contentPadding(String? content) {return c…...

计算机网络基础概念

网络通信的本质就是进程间通信。我们日常使用的聊天软件、在线视频软件等&#xff0c;事实上都是本机客户端进程与远地服务端进程之间进行网络通信所实现的。我们与朋友进行远程聊天&#xff0c;本质上是从本地客户端将聊天内容发送给服务端&#xff0c;再由服务端转发给目标客…...

【原创】ubuntu22.04下载编译AOSP 15

repo init -u http://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b master source build/envsetup.sh lunch aosp_cf_x86_64_phone-trunk_staging-userdebug find ./ -name “index.lock” -exec rm -f {} ; find ./ -name “index.lock” -exec rm -i {} ;…...

鸿蒙PC新物种发布!华为MateBook Pro/ Fold深度解析:折叠屏革命与生态破局

华为在5月19日发布会上推出的两款鸿蒙电脑新品——华为MateBook Pro和HUAWEI MateBook Fold 非凡大师&#xff0c;标志着其在PC领域的深度布局和技术突破。结合发布会信息和行业背景&#xff0c;以下为分析及影响预测&#xff1a; 一、产品核心亮点及创新 华为MateBook Pro&…...

数据要素如何重构人力资本升级

一、数字经济时代 在传统工厂车间&#xff0c;老师傅的经验智慧曾是企业最宝贵的资产。而在现代的数字化办公室&#xff0c;每天产生的千万条数据流正在重塑企业创新规则。这个变革的核心密码锁定在两个关键维度&#xff1a;人力资本结构的质变与创新资源的智配。 数据要素与…...

【爬虫】12306自动化购票

上文&#xff1a; 【爬虫】12306查票-CSDN博客 下面是简单的自动化进行抢票&#xff0c;只写到预定票&#xff0c;没有写完登陆&#xff0c; 跳出登陆后与上述代码同理修改即可。 感觉xpath最简单&#xff0c;复制粘贴&#xff1a; 还有很多写法&#xff1a; 官网地址&#…...

保密行业工作沟通安全:吱吱软件的“四重防泄露”设计

“工作沟通安全威胁是指在金融、科技、医疗等保密行业中&#xff0c;错发、泄露、窃取一条消息或者一份文件&#xff0c;都有可能引发数据安全灾难性失控。以往的即时通讯软件仅依赖单一的加密手段&#xff0c;无法满足保密行业从发送、传输到接受全链路加密的更高规格的数据安…...