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

C++初阶-vector的模拟实现3

目录

1.预备知识:initializer_list

1.1初步了解

1.2关于initializer_list的deepseek的回答

C++中的 std::initializer_list

主要特性

常见用途

1. 接受列表的构造函数和函数

2. 基于范围的 for 循环

重要注意事项

实现示例

2.vector::vector(initializer_list il)(C++11新构造函数的实现)

2.1vector::vector(initializer_list il)简单应用

2.2vector::vector(initializer_list il)模拟实现

3.template vector(InputIterator first, InputIterator last)(构造函数)的模拟实现

4.vector(size_t n, const T& val = T())的模拟实现

T()什么意思

缺省值 T() 的含义

实际使用示例

为什么这样设计

注意事项

5.问题分析

解决方案

6.模拟实现vector的代码总结

7.总结



1.预备知识:initializer_list

1.1初步了解

这个东西在以后用得地方也比较多,也是C++11新增加的,有了这个东西的基础我们之后就可以按照我们自己想要的方式进行初始化了。那么这是个什么呢?这里只简单介绍一下用法,感兴趣的可以自己去搜索一下这个。

这是在C++官网中有的initializer_list的解释后的中文界面。我们是看不懂它的意思的,但是如果说,这个与数组有关会怎么样?

之前见过很多数组,但是那些数组好像都是内置类型,而这个可以用来存储自定义类型。

其实现在我们还是有些不懂的,我们来看一下示例:

auto il={10,20,30};

我们就觉得这个代码好像有些不对。因为之前我们用这个的时候不是这样定义的吗?

auto il[]={10,20,30};

为什么这个就不一样呢?

这个是把花括号({})里面的数传递给一个对象,它会默认任务这个对象il的类型为initializer_list。因为它是模板,会根据花括号内的数据类型来知道类型。我们可以看出这个是一个类模板,也就是说它是系统库的一个容器,它支持begin、end、size构造:

其中begin和end也支持迭代器版本。如果不信il的类型为initializer_list,那么我们可以运行一下以下代码:

int main()
{auto il = { 1,2,3,4,5 };cout << typeid(il).name() << endl;
}

这个代码可以打印出il的真实类型,所以最终运行结果如下:

我们通过打印的结果推断出il是根据initializer_list类实例化出的int对象。这样相对于传统写法我们就有改进了。

此外我们如果想要访问il中的元素,就可以直接:il.begin()或者il.begin()+n即可。

那么对于这个东西的详细解释是什么?

我们来根据deepseek的生成来更加了解一下它:

1.2关于initializer_list的deepseek的回答

C++中的 std::initializer_list

std::initializer_list 是 C++11 引入的一个轻量级代理对象,它提供对同一类型对象数组的访问。主要用于支持统一的初始化语法,并允许函数以类型安全的方式接受可变数量的同类型参数。

主要特性
  1. 初始化:用于列表初始化(花括号初始化语法)

  2. 轻量级:通常实现为一对指针或一个指针加大小

  3. 不可变:不能通过 initializer_list 修改元素

  4. 临时生命周期:底层数组与 initializer_list 对象具有相同的生命周期

常见用途
1. 接受列表的构造函数和函数
#include <initializer_list>
#include <vector>class MyClass 
{
public:MyClass(std::initializer_list<int> list) {// 从列表初始化}
};void func(std::initializer_list<std::string> args) 
{for (const auto& arg : args) {// 处理每个参数}
}int main() 
{MyClass obj{1, 2, 3, 4};  // 使用 initializer_list 构造函数func({"你好", "世界"});    // 传递 initializer_list 给函数std::vector<int> v = {1, 2, 3, 4};  // vector 使用 initializer_list
}
2. 基于范围的 for 循环
for (int x : {1, 2, 3, 4}) 
{  // 创建临时 initializer_liststd::cout << x << " ";
}
重要注意事项
  1. 底层数组始终是 const - 不能通过 initializer_list 修改元素

  2. 创建 initializer_list 时会复制元素(不会发生移动)

  3. 底层数组的生命周期与 initializer_list 对象相同

  4. 标准库容器(如 std::vectorstd::map 等)常用它来支持花括号列表初始化

实现示例

下面是一个在自己类中使用 initializer_list 的简单例子:

#include <initializer_list>
#include <iostream>class NumberList 
{std::size_t count;const int* data;
public:NumberList(std::initializer_list<int> list) : count(list.size()), data(list.begin()) {}void print() const {for (std::size_t i = 0; i < count; ++i) {std::cout << data[i] << " ";}std::cout << "\n";}
};int main() 
{NumberList nums{1, 2, 3, 4, 5};nums.print();  // 输出: 1 2 3 4 5
}

std::initializer_list 是一个强大的特性,它实现了简洁直观的初始化语法,同时保持了类型安全。

2.vector::vector(initializer_list<T> il)(C++11新构造函数的实现)

2.1vector::vector(initializer_list<T> il)简单应用

这个构造函数才是我们用得最多的构造函数,其他的那些无参构造还有那种用几个相同的元素构造都太低级了,我们完全可以用这个代替,所以刚刚讲的initializer_list就派上了用场了,我们可以用这个构造函数这样写:

void test()
{std::vector<int> v = { 1,2,3,4,5,6,7 };for (const auto& e : v){cout << e << " ";}cout << endl;
}

那么运行结果为:

所以我说这个构造函数才是最常用的,因为它很方便啊,不用我们一个一个push_back了。那这个函数如何实现呢?

2.2vector::vector(initializer_list<T> il)模拟实现

这个构造函数相对于其他的函数有些不一样,但是我们可以先reserve   il个大小的空间,然后遍历il,并把il的数据一个一个push_back到对象结尾,则:

vector(initializer_list<T> il)
{reserve(il.size());for (auto& e : il){push_back(e);}
}

我们来测试一下这个函数:

void test()
{td::vector<int> i = { 4,6,2,4,8,9 };for (const auto& e : i){cout << e << " ";}cout << endl;
}

那么运行结果为:

则之前实现的函数没有问题。

3.template <class InputIterator>
vector(InputIterator first, InputIterator last)(构造函数)的模拟实现

这个可以是一个类模板的成员函数,也可以是一个函数模板。此外,这个InputIterator就是只读迭代器的意思,所以我们可以传递任何有效的迭代器,在list中我会额外讲解一个Iterator的分类,其中有每个迭代器如何正确使用,为什么每个容器的迭代器类型不同的原因。而我们由于是插入一段迭代器,所以可以传递除了OutputIterator外的迭代器:

这个不是重点,重点是我们要知道该种构造函数是如何实现的。

这个构造函数是用一段迭代器区间的值来初始化,我们是先的时候直接通过迭代器来遍历first到lat这段区间,并尾插数据至该对象即可,那么最终实现为:

template <class InputIterator>
vector(InputIterator first, InputIterator last)
{while (first != last){push_back(*first);++first;}
}

我们来测试一下这个函数:

void test()
{td::vector<int> v1 = { 3,5,3,4,6,7,2,0 };td::vector<int> v2(v1.begin() + 3, v1.end() - 2);//也可以这样使用int v3[] = {4,5,6,2,4};td::vector<int> v4(v3 + 1, v3 + 4);for (const auto& e : v1){cout << e << " ";}cout << endl;for (const auto& e : v2){cout << e << " ";}cout << endl;for (const auto& e : v4){cout << e << " ";}cout << endl;
}

那么运行结果为:

为什么我们可以用第二种方式来进行传递?

因为这相当于原生指针,迭代器模拟的是指针的行为。而指向数组元素的指针是可以当做迭代器用的,我们也可以用来进行sort来进行数组排序,而不是再创建一个迭代器来进行排序。

4.vector(size_t n, const T& val = T())的模拟实现

这个也是构造函数,只是是用n个val进行构造的,这个函数的功能和那个resize功能完全一样,所以我们直接复用那个resize函数即可:

vector(size_t n, const T& val = T())
{resize(n, val);
}

那么这个缺省值又是什么意思,我这个也不太理解,我们可以直接问deepseek寻求答案:

T()什么意思

缺省值 T() 的含义

T() 是类型 T 的值初始化表达式,具体行为取决于类型 T 的性质:

  1. 对于内置类型

    • int() → 0

    • double() → 0.0

    • bool() → false

    • 指针类型 → nullptr

  2. 对于类类型

    • 调用该类的默认构造函数

    • 如果类没有默认构造函数,则编译错误

实际使用示例

#include <vector>
#include <iostream>int main() 
{// 使用显式初始值std::vector<int> v1(5, 10);  // 5个元素,每个都是10// v1 = {10, 10, 10, 10, 10}// 使用缺省值std::vector<int> v2(5);      // 5个元素,每个都是int()即0// v2 = {0, 0, 0, 0, 0}// 对于自定义类型struct Point {int x, y;Point() : x(0), y(0) {}  // 默认构造函数};std::vector<Point> v3(3);    // 3个Point,每个都是Point()// v3 = {{0,0}, {0,0}, {0,0}}
}

为什么这样设计

这种设计提供了灵活性:

  • 当需要特定初始值时,可以显式指定

  • 当只需要默认值时,可以省略第二个参数

  • 保持与内置数组初始化行为的一致性(int arr[5] = {}

注意事项

  1. 如果 T 没有默认构造函数,则不能省略第二个参数

  2. 对于非基本类型,T() 可能会比想象中更耗时(涉及构造函数调用)

  3. C++11 后更推荐使用列表初始化 std::vector<int> v{1, 2, 3}

所以说这个T()的作用还是比较大的,这也是C++设计的比较好的地方!

5.问题分析

如果我们运行以下代码:

void test()
{td::vector<double> v1(10, 0.1);for (const auto& e : v1){cout << e << " ";}cout << endl;td::vector<int> v2(10, 1);for (const auto& e : v2){cout << e << " ";}
}

那么结果是:

这个报错怎么在那个用一段迭代器初始化的那个函数那里?

我们通过调试发现在到double实例化个类的时候还是可以调用正确的构造函数,但是为什么我们用int实例化个类的时候就调用的构造函数不是正确的!我们在C++模板中讲过,C++编译器在进行类型传参时有个原则:匹配更匹配的!而且这是在有选择的情况下,所以这个情况就是那个用迭代器区间进行初始化的构造函数更匹配!所以出现了类型匹配的问题。因为用n个val进行初始化,那么第一个参数是size_t类型,而我们实例化是实例化为int类型,所以造成了类型匹配的问题。

我们可以把那个用n个val值进行初始化的构造函数的第一个参数改为int类型,但是最好的解决方案是:再写一个第一个参数为int类型的参数的重载函数。(这也是库函数对这种情况的解决办法)

解决方案

添加这个函数:

vector(int n, const T& val = T())
{resize(n, val);
}

那么最后结果为:

虽然n是int类型,但是在传给resize时会进行类型转换,所以不会报错!

6.模拟实现vector的代码总结

这都是最终版本的实现代码,其他版本的就没在里面了。

#include<iostream>
#include<vector>
#include<string>
#include<assert.h>
using namespace std;
namespace td
{template<class T>class vector{public:typedef T* iterator;typedef const T* const_iterator;~vector(){delete[] _start;_start = _finish = _end_of_storage = nullptr;}size_t size() const{return _finish - _start;}size_t capacity() const{return _end_of_storage - _start;}iterator begin(){return _start;}iterator end(){return _finish;}bool empty() const{return begin() == end();}void push_back(const T& x){if (_finish == _end_of_storage){reserve(capacity() == 0 ? 4 : capacity() * 2);}*_finish = x;++_finish;}T& operator[](size_t i){assert(i < size());return _start[i];}const T& operator[](size_t i) const{assert(i < size());return _start[i];}const_iterator begin() const{return _start;}const_iterator end() const{return _finish;}void pop_back(){assert(_finish > _start);--_finish;}void erase(iterator pos){assert(pos >= _start);assert(pos <= _finish);if (pos == _finish){pop_back();return;}iterator it = pos + 1;while (it < _finish){*(it - 1) = *it;++it;}--_finish;}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 resize(size_t n, const T& val = T()){if (n < size()){_finish = _start + n;}else{reserve(n);while (_finish != _start + n){*_finish = val;++_finish;}}}vector(const vector<T>& v){reserve(v.size());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);}vector<T>& operator=(vector<T> x){swap(x);return *this;}vector(){}void reserve(size_t n){if (n > capacity()){size_t oldSize = size();//开辟新空间T* tmp = new T[n];//拷贝数据for (size_t i = 0; i < oldSize; i++){tmp[i] = _start[i];}//释放空间delete[] _start;_finish = tmp + oldSize;_start = tmp;_end_of_storage = _start + n;}}vector(initializer_list<T> il){reserve(il.size());for (auto& e : il){push_back(e);}}template <class InputIterator>vector(InputIterator first, InputIterator last){while (first != last){push_back(*first);++first;}}vector(size_t n, const T& val = T()){resize(n, val);}vector(int n, const T& val = T()){resize(n, val);}private:iterator _start = nullptr;iterator _finish = nullptr;iterator _end_of_storage = nullptr;};
}

7.总结

vector的实现相对于string的实现简单一些,但是还是有很多东西需要掌握的,我实现的也只是一些比较重要的,其他的如:assign这些用的得不多的函数我就不实现了,感兴趣的可以自己去实现。好了,vector的所有部分都已经完结了。喜欢的可以一键三连哦,下讲将讲解:list。下讲再见!

相关文章:

C++初阶-vector的模拟实现3

目录 1.预备知识&#xff1a;initializer_list 1.1初步了解 1.2关于initializer_list的deepseek的回答 C中的 std::initializer_list 主要特性 常见用途 1. 接受列表的构造函数和函数 2. 基于范围的 for 循环 重要注意事项 实现示例 2.vector::vector(initializer_li…...

详解鸿蒙仓颉开发语言中的日志打印问题

一门新的开发语言在诞生初期&#xff0c;由于它本身的特性和使用人数暂时较少&#xff0c;会容易出现一些大家不太容易理解的问题&#xff0c;或者说有一些坑。今天就详细分享一下仓颉开发语言中的日志打印相关内容&#xff0c;带大家踩一踩坑。 AppLog 在新创建的项目中&…...

dify基于文本模型实现微调Fine-tune语料构造工作流

主要是分为5个部分。分别是&#xff1a;开始、文档提取器、代码执行、LLM大语言模型、结束 5个部分 打开dify&#xff0c;创建一个空白页面-选择工作流&#xff0c;我们给应用起个名字。 创建完成后&#xff0c;进入工作流画布界面 开始 在开始节点中新建2个输入参数。1个是用…...

手机充电协议

1、手机快充 公有&#xff1a;PD、QC(高通骁龙芯片&#xff09; 私有&#xff1a; 华为&#xff1a;FCP&#xff08;fast charge protocol) 、SCP( super charge protocol) 、 小米&#xff1a; Mi Turbo Charge oppo&#xff1a;VOOC/SuperVOOC vivo&#xff1a;FlashCharge、…...

HarmonyOS 应用开发,如何引入 Golang 编译的第三方 SO 库

本指南基于笔者临时修复的 ohos_golang_go 项目fork&#xff0c;解决HO 应用导入 cgo编译产物时的 crash 问题。 1. 下载 ohos_golang_go git clone https://gitcode.com/deslord/ohos_golang_go.git&#x1f4cc; 该仓库为笔者临时修复版本&#xff0c;修复了 CGO 编译模式下…...

polarctf-web-[某函数的复仇]

考点&#xff1a; 匿名构造函数(create_function) 题目来源&#xff1a;polarctf-web-[某函数的复仇] 解题&#xff1a; 代码审计&#xff1a; <?phphighlight_file(__FILE__);//flag:/flagif(isset($_POST[shaw])){$shaw $_POST[shaw];$root $_GET[root];if(preg_mat…...

Node.js Express 项目现代化打包部署全指南

Node.js Express 项目现代化打包部署全指南 一、项目准备阶段 1.1 依赖管理优化 # 生产依赖安装&#xff08;示例&#xff09; npm install express mongoose dotenv compression helmet# 开发依赖安装 npm install nodemon eslint types/node --save-dev1.2 环境变量配置 /…...

华为云Flexus+DeepSeek征文|Flexus云服务器Dify-LLM资源部署极致体验Agent

前引&#xff1a;重磅来袭&#xff01;本次以DeepSeek-V3/R1商用大模型和Dify-LLM应用平台一键部署为核心&#xff0c;专为新手打造“开箱即用”的AI开发体验。无论你是想快速搭建企业级AI应用&#xff0c;还是探索大模型落地的无限可能&#xff0c;只需跟随小编实现三步走&…...

Java详解LeetCode 热题 100(18):LeetCode 73. 矩阵置零(Set Matrix Zeroes)详解

文章目录 1. 题目描述2. 理解题目3. 解法一&#xff1a;使用两个额外数组标记法3.1 思路3.2 Java代码实现3.3 代码详解3.4 复杂度分析3.5 适用场景 4. 解法二&#xff1a;使用矩阵的第一行和第一列作为标记4.1 思路4.2 Java代码实现4.3 代码详解4.4 复杂度分析4.5 适用场景 5. …...

MySQL刷题 Day08

LC 1341电影评分 本题思路简单&#xff0c;但一不注意就错了 &#xff1a; 不难想到用union&#xff0c;写出如下代码&#xff1a; (select u.name results from MovieRating mr left join Users u on mr.user_id u.user_id group by mr.user_id order by count(mr.user_id…...

linux查看本机服务器的外网IP命令

在 Linux 中查看本机服务器的外网 IP&#xff08;公网 IP&#xff09;可以通过以下几种方法&#xff1a; 1. 使用 curl 查询外部服务&#xff08;推荐&#xff09; curl ifconfig.me或&#xff1a; curl icanhazip.com或&#xff1a; curl ipinfo.io/ip这些服务会返回你的公…...

DVWA-XSS

DOM low 这是一个下拉框的形式&#xff0c;但是如果我们不让他等于English呢&#xff0c;换成js代码呢&#xff1f; <script>alert(xss);</script> Medium <script> 标签&#xff0c;但仅使用简单的字符串匹配进行替换&#xff08;比如移除 "<scr…...

第15天-NumPy科学计算实战:从基础到图像处理

一、NumPy核心优势 高效数组运算:矢量操作比纯Python快10-100倍 广播机制:不同形状数组的算术运算 内存优化:连续内存块存储,支持大数据处理 丰富API:线性代数、傅里叶变换、随机数生成等 二、环境准备 pip install numpy matplotlib 三、基础操作演示 1. 创建数组 im…...

Spring Boot + +小程序, 快速开发零工市场小程序

现在零工经济发展的越来越好&#xff0c;不止是很多人想要利用空余时间找零工赚外快&#xff0c;也有很多企业有灵活用工的需求&#xff0c;根据这样的需求&#xff0c;我们利用Spring Boot 和小程序&#xff0c;快速开发出了零工市场小程序。 利用 Spring Boot 开发零工市场小…...

Vue 3.0中核心的Composition API

在当今快速发展的前端生态系统中&#xff0c;Vue 3.0以其革命性的Composition API重新定义了组件开发的范式。作为Vue框架的一次重大进化&#xff0c;Composition API不仅解决了Options API在复杂组件中面临的逻辑复用和组织难题&#xff0c;更为开发者提供了更灵活、更强大的代…...

洛谷B3840 [GESP202306 二级] 找素数

题目描述 小明刚刚学习了素数的概念&#xff1a;如果一个大于 1 的正整数&#xff0c;除了 1 和它自身外&#xff0c;不能被其他正整数整除&#xff0c;则这个正整数是素数。现在&#xff0c;小明想找到两个正整数 A 和 B 之间&#xff08;包括 A 和 B&#xff09;有多少个素数…...

Axure设计之带分页的穿梭框原型

穿梭框&#xff08;Transfer&#xff09;是一种常见且实用的交互组件&#xff0c;广泛应用于需要批量选择或分配数据的场景。 一、应用场景 其典型应用场景包括&#xff1a; 权限管理系统&#xff1a;批量分配用户角色或系统权限数据筛选工具&#xff1a;在大数据集中选择特…...

VsCode开发环境之Node.js离线部署

1.下载node部署文件 地址为&#xff1a;CNPM Binaries Mirror 2.下载后解压 3.验证版本 4.配置环境变量 5.外网寻找一个对应项目的npm文件--node_modules 6.node_modules文件夹复制到node.js的路径下 7.接着就可以正常运行了。...

补充Depends 和 request: Request 依赖注入用法的注意事项

不要在非路由函数&#xff08;如类的 __init__ 方法或普通模块函数&#xff09;中直接使用 Depends() 或 request。 Depends 和 request: Request 是 FastAPI 提供的依赖注入机制的一部分&#xff0c;仅适用于FastAPI 路由函数或由 FastAPI 调用的依赖函数中。在类初始化、模块…...

uniapp-商城-64-后台 商品列表(商品修改---页面跳转,深浅copy应用,递归调用等)

完成了商品的添加和展示&#xff0c;下面的文字将继续进行商品页面的处理&#xff0c;主要为商品信息的修改的页面以及后天逻辑的处理。 本文主要介绍了商品信息修改页面的实现过程。首先&#xff0c;页面布局包括编辑和删除功能&#xff0c;未来还可添加上架和下架按钮。通过c…...

【MySQL】联合查询(上)

目录 一. 什么是联合查询 二. 笛卡尔积 三. 内连接查询 示例演示 四. 外连接 示例演示 五. 自连接 自连接 示例演示 一. 什么是联合查询 在之前学习的增删改查中都是对于单表进行查询&#xff0c;但是因为在数据库设计时需要遵循范式的要求&#xff0c;数据就会被拆分到多…...

Model 是 Agent 的大脑(以camel为例)

Model 是 Agent 的大脑&#xff0c;负责处理所有输入和输出数据。通过有效调用不同的模型&#xff0c;智能体可以根据任务需求执行文本分析、图像识别和复杂推理等操作。CAMEL 提供了一系列标准和可定制的接口&#xff0c;并与各种组件无缝集成&#xff0c;以赋能大语言模型&am…...

Linux条件变量

在 Linux 系统中&#xff0c;pthread_cond_init() 函数和条件变量&#xff08;Condition Variable&#xff09;是多线程编程中用于线程同步的核心机制。它们通过协调线程间的等待与通知逻辑&#xff0c;解决共享资源的竞争问题。以下从功能、工作机制、使用场景和注意事项等方面…...

k8s-NetworkPolicy

在 Kubernetes 中&#xff0c;NetworkPolicy 是一种资源对象&#xff0c;用于定义 Pod 之间的网络通信策略。它允许你控制哪些 Pod 可以相互通信&#xff0c;以及如何通信。通过使用 NetworkPolicy&#xff0c;可以实现更细粒度的网络访问控制&#xff0c;增强集群的安全性。 1…...

什么是“架构孤岛”?如何识别与整合?为什么现代企业在追求敏捷开发的同时,反而更容易陷入架构孤岛陷阱?

在现代信息技术飞速发展的时代,系统架构日益复杂,组织在构建与演进其信息系统时,面临着前所未有的挑战。然而,就在不断追求敏捷性、可扩展性与数字化创新的过程中,一个被广泛忽视却日益严峻的问题悄然浮现——“架构孤岛”。它们像岛屿一样,彼此孤立,通信不畅,数据难以…...

nfs存储IO等待,导致k8s业务系统卡慢问题处理

注:服务器配置:64C,128G,麒麟v10系统,系统磁盘使用空间(5T)均低于50%,存储磁盘iops约为800左右 发现业务系统卡慢,使用top 命令查看.系统负载较高长期保持在60以上,发现wa值的指标参数长期高于15,返现CPU用于写入磁盘IO等待的时间较高,系统的磁盘I/O压力较大. 配合开发查看日志…...

如何使用两块硬盘作为 Ubuntu24 的系统盘,实现坏掉一块不影响系统运行。

最近我想使用Ubuntu组一个NAS系统&#xff0c;想实现系统盘冗余&#xff0c;各位大佬可以给点建议吗。 Deep Seek 为了实现两块硬盘作为 Ubuntu 24 系统盘的冗余配置&#xff08;RAID 1&#xff09;&#xff0c;确保一块硬盘损坏时系统仍可运行&#xff0c;以下是详细步骤&am…...

电子电气架构 --- 细化造车阶段流程

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

物联网之使用Vertx实现UDP最佳实践【响应式】

小伙伴们&#xff0c;你们好呀&#xff0c;我是老寇&#xff0c;跟我一起学习使用Vertx实现UDP-Server 实现UDP【响应式】 Vertx-Core地址 注意 UDP是无连接的传输&#xff0c;这意味着您与远程客户端没有建立持续的连接。 所以&#xff0c;您发送和接收的数据包都要包含有…...

代码管理平台Gitlab如何通过快解析实现远程访问?

一、Gitlab功能介绍 Gitlab是被广泛使用的基于git的开源代码管理平台&#xff0c;用于管理、存储开发人员代码&#xff0c;同时可以协同开发 二、外网试用Gitlab遇到的问题 运维人员将Gitlab服务器部署在总部机房&#xff0c;而分公司开发人员和出差运维人员就无法访问Gitlab…...

七彩喜防摔马甲:科技守护银发安全的“隐形铠甲”

随着现代人生活方式的多样化&#xff0c;尤其是在户外运动和骑行等活动中&#xff0c;安全问题日益受到重视。 七彩喜防摔马甲&#xff0c;作为一款兼具防护性与舒适性的智能穿戴设备&#xff0c;正在改变人们对传统防护装备的认知。 创新设计 防摔马甲的设计灵感来源于人体…...

IDEA推送到gitlab,jenkins识别,然后自动发布到需要的主机

实验环境 192.168.8.100 gitlab 192.168.8.200 jenkins mvn 192.168.8.10 测试主机 默认都关闭了防火墙和setenforce 实验要求 实验在IDEA上面推送代码然后gitlab推送给jenkins&#xff0c;然后mvn构建&#xff0c;最后发布到测试主机上面 实验开始 在tomcat上安装manve…...

五、【API 开发篇(下)】:使用 Django REST Framework构建测试用例模型的 CRUD API

【API 开发篇】&#xff1a;使用 Django REST Framework构建测试用例模型的 CRUD API 前言第一步&#xff1a;增强 Serializers (序列化器) - 处理关联和选择项第二步&#xff1a;创建 TestCaseViewSet (视图集) - 支持过滤第三步&#xff1a;注册 TestCaseViewSet 到 Router第…...

IDEA推送到gitlab,jenkins识别,然后自动发布到需要的主机(流水线)

jenkins流水线 新建项目 找到流水线选择脚本 3.点击流水线语法开始编辑脚本 4.生成流水线脚本复制 5.修改脚本 6.继续添加(手打) 7.继续生成添加 8.最终脚本 9.保存测试 10.构建 11.访问主页查看是否修改...

四、【API 开发篇 (上)】:使用 Django REST Framework 构建项目与模块 CRUD API

【API 开发篇 】&#xff1a;使用 Django REST Framework 构建项目与模块 CRUD API 前言为什么选择 Django REST Framework (DRF)&#xff1f;第一步&#xff1a;创建 Serializers (序列化器)第二步&#xff1a;创建 ViewSets (视图集)第三步&#xff1a;配置 URLs (路由)第四步…...

vscode连接本地Ubuntu

因为在学习项目的时候&#xff0c;自己的云服务器性能太差一直要编译很长时间&#xff0c;而且总是连接失败&#xff0c;所以搞了一个Ubuntu25.04的系统在自己的vmare中。 其中参考了以下文章。 Ubuntu 24.04 桌面版安装指南(2025版) | 官网镜像下载启动盘制作保姆级图文教程…...

idea无法识别Maven项目

把.mvn相关都删除了 导致Idea无法识别maven项目 或者 添加导入各个模块 最后把父模块也要导入...

Redis应用--缓存

目录 一、什么是缓存 1.1 二八定律 二、使用Redis作为缓存 三、缓存的更新策略 3.1 定期更新 3.2 实时生成 四、缓存预热、缓存穿透、缓存雪崩和缓存击穿 4.1 缓存预热 4.2 缓存穿透 4.3 缓存雪崩 4.4 缓存击穿 一、什么是缓存 缓存(cache)是计算机的一个经典的概念…...

大语言模型与人工智能:技术演进、生态重构与未来挑战

目录 技术演进:从专用AI到通用智能的跃迁核心能力:LLM如何重构AI技术栈应用场景:垂直领域的技术革命生态关系:LLM与AI技术矩阵的协同演进挑战局限:智能天花板与伦理困境未来趋势:从语言理解到世界模型1. 技术演进:从专用AI到通用智能的跃迁 1.1 三次技术浪潮的跨越 #me…...

多模态大语言模型arxiv论文略读(八十六)

EVALALIGN: Supervised Fine-Tuning Multimodal LLMs with Human-Aligned Data for Evaluating Text-to-Image Models ➡️ 论文标题&#xff1a;EVALALIGN: Supervised Fine-Tuning Multimodal LLMs with Human-Aligned Data for Evaluating Text-to-Image Models ➡️ 论文作…...

C++--string类对象

一,引言 string类对象在于更好的处理字符串问题&#xff0c;为对于字符串这一类型提供更加方便的接口和运算符的重载。本片文章首先会引入auto关键字和范围for两个C11小语法。之后按照如下网站所提供的顺序经行讲解。cplusplus.com - The C Resources Networkhttps://legacy.c…...

云计算与大数据进阶 | 28、存储系统如何突破容量天花板?可扩展架构的核心技术与实践—— 分布式、弹性扩展、高可用的底层逻辑(下)

在上篇中&#xff0c;我们围绕存储系统可扩展架构详细探讨了基础技术原理与典型实践。然而&#xff0c;在实际应用场景中&#xff0c;存储系统面临的挑战远不止于此。随着数据规模呈指数级增长&#xff0c;业务需求日益复杂多变&#xff0c;存储系统还需不断优化升级&#xff0…...

Python _day31

DAY 31 文件的规范拆分和写法 今日的示例代码包含2个部分 notebook文件夹内的ipynb文件&#xff0c;介绍下今天的思路项目文件夹中其他部分&#xff1a;拆分后的信贷项目&#xff0c;学习下如何拆分的&#xff0c;未来你看到的很多大项目都是类似的拆分方法 知识点回顾 规范的文…...

【JavaWeb】MyBatis

1 介绍 什么是MyBatis? MyBatis是一款优秀的 持久层 框架&#xff0c;用于简化JDBC的开发。 MyBatis本是 Apache的一个开源项目iBatis&#xff0c;2010年这个项目由apache迁移到了google code&#xff0c;并且改名为MyBatis 。2013年11月迁移到Github。 MyBatis官网https://my…...

vue2实现【瀑布流布局】

瀑布流 1. 解释2. 形成结构和样式3. 自定义指令 1. 解释 瀑布流特征&#xff1a; 等宽不等高&#xff1a;元素宽度固定&#xff0c;高度根据内容自适应。错落排列&#xff1a;元素像瀑布一样从上到下依次填充&#xff0c;自动寻找最短列插入 体现&#xff1a;图中第一排1&…...

系统架构设计(十六):敏感点、权衡点、风险点和非风险点

术语定义 概念定义说明敏感点&#xff08;Sensitivity Point&#xff09;架构设计中对某个质量属性有显著影响的点&#xff0c;一旦改变该点&#xff0c;会显著影响系统的某个质量属性。风险点&#xff08;Risk Point&#xff09;由于架构决策带来的潜在失败风险&#xff0c;可…...

优化dp贪心数论

这次三个题目都来自牛客周赛93&#xff0c;个人觉得出的很好&#xff0c;收获颇多。 1.简单贪心 题目意思&#xff1a; 任意选定两个数字&#xff0c;相加之和替代两个数字中的一个&#xff0c;另一个抹除。求操作之后最大字典序之和 思路&#xff1a; 最大字典序之和&…...

详解MySQL 的 binlog,redo log,undo log

MySQL 的 binlog、redo log 和 undo log 是数据库事务处理与数据一致性的核心组件&#xff0c;各自承担不同的职责。 1. binlog&#xff08;二进制日志&#xff09; 定位&#xff1a;MySQL Server 层实现的逻辑日志&#xff0c;与存储引擎无关。作用&#xff1a; 主从复制&…...

SymPy|主元、重新表示、分数、约分表达式、极限、级数、ode、获取值、输出形式

SymPy 是一个 Python 的符号计算库&#xff0c;广泛应用于数学计算、物理建模、工程分析等领域。本文将详细介绍 SymPy 在处理主元操作、重新表示、分数、约分表达式、极限、级数、常微分方程&#xff08;ODE&#xff09;以及获取值和输出形式等方面的应用&#xff0c;通过完整…...

Java 05正则表达式

正则表达式 1.简介 一个字符串&#xff0c;指定一些规则&#xff0c;来校验其他的字符串 String s"";规则 需要进行匹配的字符串.matches(s);来判断2.字符类**&#xff08;单个&#xff09; [abc] String s"[ABC]"; "A".matches(s);返回true…...