C++初阶-list的使用1
目录
1.std::list简介
2.成员函数
2.1构造函数的使用
2.2list::operator=的使用
3.迭代器
4.容量
4.1list::empty函数的使用
4.2list::size函数的使用
4.3list::max_size函数的使用
5.元素访问
6.修饰符
6.1list::assign函数的使用
6.2push_back和pop_back和push_front和pop_front函数的使用
6.3emplace_back和emplace_front和emplace的函数的使用
基本概念
完整示例代码
输出结果分析
关键点说明
实际应用场景
6.4list::insert和list::erase函数的使用
6.5list::swap函数的使用
6.6list::resize的使用
7.总结
1.std::list简介
std::list就是C++实现的双向循环链表。所以需要大家有预备知识,可以看我数据结构的博客:https://blog.csdn.net/2401_86446710/article/details/145201866?sharetype=blogdetail&sharerId=145201866&sharerefer=PC&sharesource=2401_86446710&sharefrom=mp_from_linkhttps://blog.csdn.net/2401_86446710/article/details/145201866?sharetype=blogdetail&sharerId=145201866&sharerefer=PC&sharesource=2401_86446710&sharefrom=mp_from_link
list是一个容器,允许在任意位置进行常数个时间的插入/删除,是一个全名为:带头双向循环链表。
我们可以在C++官网(进入链接:https://legacy.cplusplus.com/reference)中搜索list看到:
那么如果把下面的一大部分的英文翻译一下就能简单了解一下这个list了:
其中forward的意思就是提前的意思,也就是说forward_list是单向链表,不过单向链表的功能在双向链表上面都有,所以我们常使用双向链表。而且在数据结构部分我们了解到:链表是由一个一个结点组成,而且也没有空间是否足够的概念,也就是说链表不会有reserve和是否要扩容的问题,虽然看似简单了,但是每个结点都有指向前面一个结点的prev指针,与指向后面一个结点的next指针,以及存储的数据data。所以在理解上相对于之前的string、vector的难度也上升了!而且现在遍历方式也是不能用下标的方式了,只可以用迭代器的方式了,但是链表这种东西复杂了,应对多种情况也是有很大的提升的。所以学好链表这一个容器还是有比较大的意义的!
链表这个容器包含于头文件:<list>
此外list还有以下的typedef后的类型,后面可能会用到,这是英语界面:
这是简单翻译后的中文界面:
这些类型我们基本上可以通过英文能看出来,而且我们基本上在vector上见过了。
2.成员函数
成员函数包括以下函数:
2.1构造函数的使用
除了第5个我们现在用不上以外,其他的我们基本上都是要使用的,其中我们不需要管那个const allocator_type& alloc这个参数,因为那个涉及到内存池,所以我们在这里可以不看,参数我们也不考虑,因为有缺省值。
所以这样看了之后:(1)这是一个无参的构造函数;(2)这是一个用n个val或者构造n个结点的空间但不进行初始化的构造函数;(3)这是用一段迭代器区间进行初始化;(4)这是一个拷贝构造函数,用一个已经实例化的对象去实例化另外一个对象;(6)这是一个用一个数组实例化对象的构造。
以下是每个函数的代码演示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<list>
#include<iostream>
using namespace std;
#include<vector>
//构造函数的使用
int main()
{//(1)list<int> l1;//(2).1list<int> l2(3);//(2).2list<int> l3(4, 1);//(3)vector<int> v1 = { 3,5,62,5,6,3,7,9,20 };list<int> l4(v1.begin() + 1, v1.end() - 2);//(4)list<int>l5(l3);//(6)list<int>l6 = { 3,4,6,5,7,3 };//也可以这样写//list<int>l6({3,4,6,5,7,3});//这个是迭代器实现的,所以可以这样遍历for (const auto& e : l1){cout << e << " ";}cout << endl;for (const auto& e : l2){cout << e << " ";}cout << endl;for (const auto& e : l3){cout << e << " ";}cout << endl;for (const auto& e : l4){cout << e << " ";}cout << endl;for (const auto& e : l5){cout << e << " ";}cout << endl;for (const auto& e : l6){cout << e << " ";}cout << endl;return 0;
}
那么运行结果为:
可以知道,如果是用(2)的第一个函数,那么开始就会初始化为0,而不是不初始化!
2.2list::operator=的使用
我们可以看到这个函数有三种赋值方式,第二种是右值引用,这个会在之后讲解。
(1)就是直接拿一个已经实例化的list对象进行赋值;(3)拿一个数组进行赋值,和我们之前构造函数(6)的意思差不多。
用法如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<list>
#include<iostream>
using namespace std;
#include<string>
//operator=的使用
int main()
{//(1)list<string> l1;string a = "Hello world";l1.push_back(a);//这样是不行的,因为这相当于拷贝构造//list<string> l2 = l1;//这样才是正确的list<string> l2;l2 = l1;//(3)list<string> l3;l3 = { "张三","李四","王五" };for (const auto& e : l1){cout << e << " ";}cout << endl;for (const auto& e : l2){cout << e << " ";}cout << endl;for (const auto& e : l3){cout << e << " ";}cout << endl;return 0;
}
那么运行结果如下:
3.迭代器
迭代器包括以下函数:
这些函数我们用begin和end作为共同点,如果前面没有任何字母,那么就是普通迭代器;如果前面有'r',那么就是反向迭代器;如果前面有'c',那么就是const迭代器;如果前面有"cr",那么就是const的反向迭代器,这些函数我直接用deepseek给出的示例就可以了:
#include <vector>
#include <iostream>int main()
{std::vector<int> v = {5, 4, 3, 2, 1};// 常规遍历std::cout << "Normal: ";for (auto it = v.begin(); it != v.end(); ++it) {std::cout << *it << " ";}// 反向遍历std::cout << "\nReverse: ";for (auto rit = v.rbegin(); rit != v.rend(); ++rit) {std::cout << *rit << " ";}// 常量遍历const auto& cv = v;std::cout << "\nConst: ";for (auto cit = cv.cbegin(); cit != cv.cend(); ++cit) {std::cout << *cit << " ";}// 常量反向遍历std::cout << "\nConst Reverse: ";for (auto crit = cv.crbegin(); crit != cv.crend(); ++crit) {std::cout << *crit << " ";}
}
/* 输出:
Normal: 5 4 3 2 1
Reverse: 1 2 3 4 5
Const: 5 4 3 2 1
Const Reverse: 1 2 3 4 5
*/
4.容量
容量部分包含以下函数:
4.1list::empty函数的使用
其中noexcept
是 C++11 引入的关键字,用于指定函数是否会抛出异常,是现代 C++ 异常处理机制的重要组成部分。noexcept
的正确使用可以显著提升C++程序的性能和可靠性,是现代C++编程的重要特性。这里就不做过多的noexcept的解释了,因为我们主要的目的是为了演示该函数的用法:
这是在list::empty后的解释的中文版本,我们可以知道它用处,那么我来简单演示一下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<list>
#include<iostream>
using namespace std;
//empty的使用
int main()
{list<int> l1 = { 2, 3, 4, 5, 6, 7 };cout << l1.empty() << endl;list<int> l2;cout << l2.empty() << endl;return 0;
}
运行结果为:
0代表false,非0代表true,所以l1非空,反之代表l2为空。
4.2list::size函数的使用
这个函数就是返回所存储数据的个数。太简单了,我就不演示了!
4.3list::max_size函数的使用
这个函数的功能就是返回可以容纳的最大元素数,也就是我们在数据结构中常说的capacity。这个函数也很简单,所以也不演示用法了!
5.元素访问
元素访问包括以下两个函数:
这两个函数的声明如下:
两个函数的功能分别是返回对列表容器中第一个元素的引用和对列表容器中最后一个元素的引用,使用如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<list>
#include<iostream>
using namespace std;
//front和back函数的使用
int main()
{list<int> a = { 3,5,6,3,4,6,43,2,4,5,2,9,0 };cout << a.front() << endl;cout << a.back() << endl;const list<int> b = { 45,6345,35,355,2,210,90,8 };cout << b.front() << endl;cout << b.back() << endl;return 0;
}
那么运行结果如下:
6.修饰符
修饰符部分包含以下函数:
由于涉及的函数比较多,我值讲解一些比较重要的内容:
6.1list::assign函数的使用
这个函数的功能如下:
这里面都有函数的使用解释,这个函数和构造函数有很多相似的,所以这里就直接演示用法了:
#define _CRT_SECURE_NO_WARNINGS 1
#include<list>
#include<iostream>
using namespace std;
#include<string>
//assign函数的使用
int main()
{//(1)string a("Hello world");list<char> l1;l1.assign(a.begin() + 2, a.end() - 2);//(2)list<string> l2;l2.assign(3, "Hello");//(3)string b("张三");string c("李四");string d("王五");list<string> l3;l3.assign({ b,c,d });for (const auto& e : l1){cout << e << " ";}cout << endl;for (const auto& e : l2){cout << e << " ";}cout << endl;for (const auto& e : l3){cout << e << " ";}cout << endl;return 0;
}
那么运行结果为:
6.2push_back和pop_back和push_front和pop_front函数的使用
这些函数都是针对一个结点的,而且也很容易知道它们的作用,一般用得也比较多,所以我在这里演示一下用法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<list>
#include<iostream>
using namespace std;
//push_front和push_back和pop_front和pop_back函数的使用
int main()
{list<int> a({ 5,3,45,2,4,3,2,1,7 });for (auto& e : a){cout << e << " ";}cout << endl;a.push_back(56);a.push_back(42);for (auto& e : a){cout << e << " ";}cout << endl;a.push_front(23);a.push_front(34);a.push_front(11);for (auto& e : a){cout << e << " ";}cout << endl;a.pop_back();for (auto& e : a){cout << e << " ";}cout << endl;a.pop_front();for (auto& e : a){cout << e << " ";}cout << endl;return 0;
}
那么运行结果如下:
6.3emplace_back和emplace_front和emplace的函数的使用
这三个函数涉及的地方比较多,所以我直接用deepseek来讲解这三个函数的用法了:
基本概念
-
emplace_back - 在list末尾直接构造元素
-
emplace_front - 在list开头直接构造元素
-
emplace - 在指定位置直接构造元素
这些函数相比push_back/push_front/insert的优势在于避免了临时对象的创建和拷贝/移动操作。
完整示例代码
#include <iostream>
#include <list>
#include <string>class Person {
public:std::string name;int age;Person(const std::string& n, int a) : name(n), age(a) {std::cout << "构造Person: " << name << " (" << age << ")\n";}Person(const Person& other) : name(other.name), age(other.age) {std::cout << "拷贝Person: " << name << " (" << age << ")\n";}Person(Person&& other) noexcept : name(std::move(other.name)), age(other.age) {std::cout << "移动Person: " << name << " (" << age << ")\n";}
};int main() {std::list<Person> people;std::cout << "=== 使用emplace_back在末尾添加 ===" << std::endl;people.emplace_back("张三", 25); // 直接在list末尾构造std::cout << "\n=== 使用emplace_front在开头添加 ===" << std::endl;people.emplace_front("李四", 30); // 直接在list开头构造std::cout << "\n=== 使用emplace在指定位置添加 ===" << std::endl;auto it = people.begin();++it; // 指向第二个位置people.emplace(it, "王五", 22); // 在第二个位置构造std::cout << "\n=== 最终列表内容 ===" << std::endl;for (const auto& p : people) {std::cout << p.name << ", " << p.age << "岁\n";}return 0;
}
输出结果分析
=== 使用emplace_back在末尾添加 ===
构造Person: 张三 (25)=== 使用emplace_front在开头添加 ===
构造Person: 李四 (30)=== 使用emplace在指定位置添加 ===
构造Person: 王五 (22)=== 最终列表内容 ===
李四, 30岁
王五, 22岁
张三, 25岁
关键点说明
-
构造效率:
-
整个过程只看到"构造Person"的输出
-
没有发生任何拷贝或移动操作
-
相比push_back/insert等更高效
-
-
参数传递:
-
参数直接传递给Person的构造函数
-
不需要先创建Person对象再插入
-
-
插入位置:
-
emplace_back
- 末尾 -
emplace_front
- 开头 -
emplace
- 任意指定位置
-
-
返回值:
-
emplace_back
返回void (C++17前) / 引用到插入元素 (C++17起) -
emplace_front
返回void (C++17前) / 引用到插入元素 (C++17起) -
emplace
返回指向新插入元素的迭代器
-
实际应用场景
-
构造成本高的对象(如大型类)
-
不可拷贝/移动的对象(只能用emplace)
-
需要精确控制构造过程的场景
-
性能敏感的关键代码路径
这些emplace函数是现代C++高效编程的重要组成部分,能显著提升容器操作的性能。
6.4list::insert和list::erase函数的使用
这个函数的第一个参数都为position,即插入的位置,那么我们就可以在对应的位置插入对应的数据(并且返回该位置开始的迭代器):
(1)在该位置插入一个值为val的数据;(2)在该位置插入n个val的数据;(3)插入一段迭代器区间;(5)插入一个类型为value_type(即T)的intitializer_list对象。
erase函数可以清除一个position这个迭代器位置的数据,也可以清除一个迭代器区间。那么我们就可以通过这两个函数进行演示:
#define _CRT_SECURE_NO_WARNINGS 1
#include<list>
#include<iostream>
using namespace std;
#include<vector>
//insert和erase
int main()
{list<int> a({ 2,3,4,6,3,4,2,9,0 });for (const auto& e : a){cout << e << " ";}cout << endl;//(1)//错误//a.insert(a.begin()+2, 4);//还是错误//auto il = a.begin();//il = il + 2;//正确使用方法1auto it1 = a.begin();//把it移动到第三个数据的位置//第二个参数是往后的步数std::advance(it1, 2);a.insert(it1, 4);for (const auto& e : a){cout << e << " ";}cout << endl;//(2)//正确使用方法2//第四个数据的位置auto it2 = std::next(a.begin(), 3);a.insert(it2, 3, 6);for (const auto& e : a){cout << e << " ";}cout << endl;//(3)auto it3 = std::next(a.begin(), 1);//错误//原因:没有这些操作符//a.insert(it3, a.begin() + 3, a.end() - 1);//正确vector<int> v1({ 4,3,42,2 });a.insert(it3, v1.begin() + 1, v1.end() - 1);for (const auto& e : a){cout << e << " ";}cout << endl;//(5)auto it4 = std::next(a.begin(), 5);a.insert(it4, { 5,3,2,1 });for (const auto& e : a){cout << e << " ";}cout << endl;//(1)auto it5 = std::next(a.begin(), 4);a.erase(it5);for (const auto& e : a){cout << e << " ";}cout << endl;//(2)auto it6 = a.begin();auto it7 = std::next(a.begin(), 7);a.erase(it6, it7);for (const auto& e : a){cout << e << " ";}cout << endl;return 0;
}
那么最终运行结果如下:
我们发现如果是连续的插入和删除,最好还是用vector,但是vector需要挪动数据,效率比较低,但是我们写起来又比较简单,所以,二者有各自的好处吧!
没想到一个insert函数要挪动数据我们很难获取位置,所以建议用vector更好一些。
6.5list::swap函数的使用
这个函数就是交换两个链表的包含头结点的所有结点,但是它的实现是只交换两个链表的头结点以及尾结点即可,所以交换效率很高,这里演示一下它的用法:
#define _CRT_SECURE_NO_WARNINGS 1
#include<list>
#include<iostream>
using namespace std;
//swap函数的使用
int main()
{list<int> l1({ 4,5,32,4,6,7,0,10,3,4 });list<int> l2(4, 3);cout << "交换前的l1:";for (const auto& e : l1){cout << e << " ";}cout << endl;cout << "交换前的l2:";for (const auto& e : l2){cout << e << " ";}cout << endl;l1.swap(l2);//也可以//l2.swap(l1)cout << "交换后的l1:";for (const auto& e : l1){cout << e << " ";}cout << endl;cout << "交换后的l2:";for (const auto& e : l2){cout << e << " ";}cout << endl;return 0;
}
那么运行结果为:
6.6list::resize的使用
这个函数的功能就是调整原来的size到n,如果原来的size比n大,那么就会删除从n到size的这些结点;反之则可能添加至n个结点(不会涉及到扩容),并把添加的每个结点所存储的数据置为val。
用法如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<list>
#include<iostream>
using namespace std;
//resize函数的使用
int main()
{list<int> l({ 5,3,2,4,7,10 });cout << "resize之前:";for (const auto& e : l){cout << e << " ";}cout << endl;l.resize(5, 10);cout << "resize第一次之后:";for (const auto& e : l){cout << e << " ";}cout << endl;l.resize(10);cout << "resize第二次之后:";for (const auto& e : l){cout << e << " ";}cout << endl;return 0;
}
那么运行结果如下:
7.总结
这是list的一些基本的函数,还有一些函数由于与之前我们学过的vector和string有些不同,所以需要进行更多的奖金,而且下一讲还会涉及到额外的知识,这个知识也是很多人没注意到的。OK,这讲内容就到这里,喜欢的可以一键三连哦,下讲再见!
相关文章:
C++初阶-list的使用1
目录 1.std::list简介 2.成员函数 2.1构造函数的使用 2.2list::operator的使用 3.迭代器 4.容量 4.1list::empty函数的使用 4.2list::size函数的使用 4.3list::max_size函数的使用 5.元素访问 6.修饰符 6.1list::assign函数的使用 6.2push_back和pop_back和push_fr…...
文献解读-病理影像多模态模型预测乳腺癌新辅助化疗的病理完全反应
期刊:Science Advances 影响因子:11.7,中科院1区Top 发表时间:2025年4月30日 概要:首都医科大学宣武医院放射科卢洁教授团队近日(2025年5月)在中科院1区top期刊《Sci Adv》(IF11.7&a…...
Docker-Mysql
查看容器的详细信息 docker inspect mysql-8.4.5 Docker 启动 local-mysql 的完整命令 docker run -d \--name local-mysql \-e MYSQL_ROOT_PASSWORDyour_root_password \-v /AllenDocker/mysql/data:/var/lib/mysql \-p 3306:3306 \--restart unless-stopped \mysql:8.4.5 验…...
鸿蒙进阶——CMakelist、GN语法简介及三方库通用移植指南
文章大纲 引言一、GN常用的内置变量二、GN常用的内置函数三、CMake 重要语法1、生成动态库2、生成静态库3、生成OBJECT 库4、重要的函数和模块4.1、add_definitions4.2、execute_process4.3、add_dependencies4.4、install4.5、FetchContent 四、GN 重要语法1、编译Target2、预…...
场景化应用实战系列六:检索问答系统
目录 景化应用实战系列六:检索问答系统 一、目标设定 二、关键知识点梳理 三、案例讲解与实战操作 1. 数据准备与预处理 2. 倒排表构建 3. 文本相似度计算 4. 检索问答系统实现 5. 系统优化与改进 一、目标设定 构建一个高效的检索问答系统,能…...
3452. 好数字之和
题目来源: LeetCode题目:3452. 好数字之和 - 力扣(LeetCode) 解题思路: 按要求判断求和即可。 解题代码: #python3 class Solution:def sumOfGoodNumbers(self, nums: List[int], k: int) -> int:r…...
GEE数据下载问题记录
GEE下载数据时的一些记录 1. GPT说 2. 验证 在未指定投影坐标系的情况下,下载原始数据导出的是MODIS Sinusoidal投影,如果单纯的对波段值进行操作,不会进行投影转换,如果涉及到波段平均,则会转投影到WGS84坐标系。如…...
P1833 樱花
P1833 樱花 - 洛谷 题目背景 《爱与愁的故事第四弹plant》第一章。 题目的描述 爱与愁大神后院里种了n棵樱花树,每棵都有美学值Ci(0≤Ci≤200)。爱与愁大神在每天上学前都会来赏花。爱与愁大神可是生物学霸,他懂得如何欣赏樱花:一种樱…...
文件操作和IO-3 文件内容的读写
文件内容的读写——数据流 流是操作系统提供的概念,Java对操作系统的流进行了封装。 数据流就像水流,生生不息,绵延不断。 水流的特点:比如要100mL的水,可以一次接10mL,分10次接完,也可以一次接…...
Day 0015:Metasploit 基础解析
目录 一、理论学习(Metasploit 架构与核心组件) 一、架构设计:分层与模块化 基础层(Ruby 框架): 核心层(模块引擎): 接口层(交互界面)&#…...
相机标定与图像处理涉及的核心坐标系
坐标系相互关系 #mermaid-svg-QxaMjIcgWVap0awV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-QxaMjIcgWVap0awV .error-icon{fill:#552222;}#mermaid-svg-QxaMjIcgWVap0awV .error-text{fill:#552222;stroke:#552…...
单例模式的运用
单例模式实现分析 在我们的向量数据库配置类 MilvusVectorDatabaseConfig 中,采用了单例模式的实现方式,这是一种非常经典且实用的设计模式。 饿汉式单例实现 这种实现方式属于饿汉式单例模式,它的优点在于: // 在类加载时就创…...
PageHelper分页原理解析:从源码到MySQL方言实现
一、引言 分页查询是Web开发的必备功能,MyBatis生态中的PageHelper以其简单易用的特性广受欢迎。本文将从源码层面(v5.3.2)解析PageHelper的分页实现机制,结合MySQL方言展示完整的执行链路。 二、核心实现原理 1. 插件初始化 …...
MySQL中索引最左前缀法则、索引失效情况、前缀索引、索引设计原则
最左前缀法则 联合索引中,最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列,如果跳跃某一列,索引将会部分失效(后面的字段索引失效)举例假设有一个联合索引包含三个字段按顺序:…...
pdf图片导出(Visio和Origin)
一、Visio 导入pdf格式图片 1. 设计->大小,适应绘图。 2. 文件->导出,导出为pdf格式。 上面两部即可得到只包含图的部分的pdf格式。 如果出现的有默认白边,可以通过以下方式设置: 1. 文件->选项->自定义功能区->…...
NR 通讯的整体架构
前言: 并假设发射器发送了一个信号,如左下角所示(蓝色),接收器检测到的信号显示在右侧(红色)。您在图中注意到的第一件事是什么?那就是发送的信号和接收的信号并不完全相同。 有什么…...
【大模型面试每日一题】Day 26:从伦理角度,大模型可能存在哪些潜在风险?技术上如何实现内容安全控制(如RLHF、红队测试)?
【大模型面试每日一题】Day 26:从伦理角度,大模型可能存在哪些潜在风险?技术上如何实现内容安全控制(如RLHF、红队测试)? 📌 题目重现 🌟🌟 面试官:从伦理角度…...
第六届电子通讯与人工智能国际学术会议(ICECAI 2025)
在数字化浪潮中,电子通讯与人工智能的融合正悄然重塑世界的运行逻辑。技术基础的共生关系是这场变革的核心——电子通讯如同“信息高速公路”,通过5G等高速传输技术,将海量数据实时输送至AI系统,使其能够像人类神经系统般快速响应…...
深入剖析 5G 核心网中的 PLMN
一、引言 在 5G 技术迅猛发展的当下,5G 核心网作为整个通信系统的关键枢纽,支撑着海量数据传输、低延迟通信以及多样化业务应用。其中,公共陆地移动网络(Public Land Mobile Network,PLMN)扮演着极为重要的角色,它是 5G 核心网实现用户接入、网络管理以及业务提供的基础…...
佰力博科技与您探讨半导体电阻测试常用的一些方法
一、两探针法 两探针法是一种较为基础的测试方法。该方法将两根探针与半导体样品表面紧密接触,通过电源在两根探针之间施加电压,同时使用电流表测量通过样品的电流,再根据欧姆定律计算电阻。这种方法的优点在于操作简单、设备要求较低&a…...
5G 核心网中的 NPN 功能详解
引言 在 5G 技术飞速发展的今天,5G 核心网不断演进,为各类应用场景提供强大支撑。其中,NPN(Non-Public Network,非公共网络)功能作为 5G 核心网的重要特性,正逐渐崭露头角,在众多行业中发挥着关键作用。它为特定用户或组织打造专属网络环境,满足其对网络性能、安全性…...
谷歌medgemma-27b-text-it医疗大模型论文速读:多语言大型语言模型医学问答基准测试MedExpQA
《MedExpQA: 多语言大型语言模型医学问答基准测试》论文解析 一、引言 论文开篇指出大型语言模型(LLMs)在医学领域的巨大潜力,尤其是在医学问答(QA)方面。尽管LLMs在医学执照考试等场景中取得了令人瞩目的成绩&#…...
# 深入解析BERT自然语言处理框架:原理、结构与应用
深入解析BERT自然语言处理框架:原理、结构与应用 在自然语言处理(NLP)领域,BERT(Bidirectional Encoder Representations from Transformers)框架的出现无疑是一个重要的里程碑。它凭借其强大的语言表示能…...
js中encodeURIComponent函数使用场景
encodeURIComponent 是 JavaScript 中的一个内置函数,它的作用是: 将字符串编码为可以安全放入 URL 的形式。 ✅ 为什么需要它? URL 中有一些字符是有特殊意义的,比如: ? 用来开始查询参数 & 分隔多个参数 连接…...
【NLP 77、Python环境管理工具之conda】
如果你第一万次否定自己,那我希望我可以一万零一次大声称赞你 —— 25.5.22 一、什么是conda conda是一个开源的包管理系统和环境管理系统,主要用于Python语言,但也可以用于其它语言的项目 二、为什么要使用conda ① 多环境共存,多…...
替代云数据库的本地方案:MySQL+phpMyAdmin的远程管理与跨网络访问技术
文章目录 前言1. 安装MySQL2. 安装phpMyAdmin3. 修改User表4. 本地测试连接MySQL5. 安装cpolar内网穿透6. 配置MySQL公网访问地址7. 配置MySQL固定公网地址8. 配置phpMyAdmin公网地址9. 配置phpmyadmin固定公网地址 前言 对于运维来说,平时还好,一旦出门…...
Dify大语言模型应用开发环境搭建:打造个性化本地LLM应用开发工作台
文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 各位小伙伴们,大家好!今天我们要来一场技术大冒险,手把手教你如何在Linux Ubuntu系统上使用Docke…...
MySQL索引事务
索引 通过索引可以对查询操作进行优化,通过减少全表扫描,快速定位数据,原本的查询操作是对表进行遍历,如果是大表效率较低 1)注意事项 占用了更多的空间,由于生成索引需要依赖于数据结构和额外数据&…...
Seay代码审计工具
Seay代码审计工具 介绍 Seay代码审计工具是一款由国内安全研究人员"Seay"开发的源代码安全审计工具,主要用于帮助安全人员快速发现PHP代码中的安全漏洞,快速定位代码中的安全风险点。 主要功能特点 自动化审计功能 支持自动扫描PHP代码中的…...
【人工智障生成日记1】从零开始训练本地小语言模型
🎯 从零开始训练本地小语言模型:MiniGPT TinyStories(4090Ti) 🧭 项目背景 本项目旨在以学习为目的,从头构建一个完整的本地语言模型训练管线。目标是: ✅ 不依赖外部云计算✅ 完全本地运行…...
技术分享:大数据挖掘平台架构设计与行业应用实践
在数字化转型浪潮下,企业数据规模呈指数级增长。如何构建高效的数据挖掘体系,实现数据价值变现,成为技术团队面临的重要课题。本文将深入探讨大数据挖掘平台的核心架构、关键技术及行业应用实践。 一、平台架构设计 1. 数据采集层 支持多源异…...
线性Wi-Fi FEM被卷死,非线性FEM是未来?
在跑了一圈路由器客户之后,我的内心反而平静下来,被卷死的不只是Wi-Fi FEM赛道,还有家用路由器市场。 尽管路由器市场比较惨淡,不过客户还是很愿意接见我,并做更广泛的交流和探讨。一方面之前推Wi-Fi FEM的众多厂商在渐…...
OpenCV CUDA模块图像过滤------用于创建一个最小值盒式滤波器(Minimum Box Filter)函数createBoxMinFilter()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数创建的是一个 最小值滤波器(Minimum Filter),它对图像中每个像素邻域内的像素值取最小值。常用于&…...
【MySQL】06.MySQL表的增删查改
1. insert 我们先创建一个表结构,这部分操作我们使用这张表完成我们的操作: mysql> create table student(-> id int primary key auto_increment,-> name varchar(20) not null,-> qq varchar(20) unique-> ); Query OK, 0 rows affec…...
MySQL 索引失效及其解决办法
一、前言 在数据库优化中,索引(Index)是一项至关重要的技术手段,可以显著提升查询性能。然而,在实际开发过程中,MySQL 索引并不总是如预期生效。本文将从原理出发,系统地介绍索引失效的常见场景及其解决方案,帮助开发者有效规避性能陷阱。 二、索引基础回顾 MySQL 支…...
在线时间戳(Unix TimeStamp)转换器
做了一个在线时间戳转换器,简单、好用,提供多种日期格式。 移动端友好。 目标是做一套在线工具集,时间戳转换只是第一步。 欢迎试用...
flutter 项目调试、flutter run --debug调试模式 devtools界面说明
Flutter DevTools 网页界面说明 1. 顶部导航栏 Inspector:查看和调试 Widget 树,实时定位 UI 问题。Performance-- 性能分析面板,查看帧率、CPU 和 GPU 使用情况,识别卡顿和性能瓶颈。Memory-- 内存使用和对象分配分析ÿ…...
Qt C++实现马的遍历问题
在这个项目中,我们面对的是一个基于中国象棋的马的遍历问题,使用了C++编程语言,并结合了Qt5库来实现图形界面和棋盘的绘制。以下是这个项目涉及的关键知识点: 马的移动规则:马在象棋中具有独特的“日”字形移动方式,即每次可以向前、后、左或右移动一格,然后在同一行或同…...
web第六次课后作业--使用ApiFox实现请求响应操作
一、实体参数 1.1 简单实体参数 1.2 复杂实体对象 如果请求参数比较多,通过上述的方式一个参数一个参数的接收会比较繁琐。此时,我们可以考虑将请求参数封装到一个实体类对象中。 要想完成数据封装,需要遵守如下规则:请求参数名…...
第十周作业
一、CSRF 1、DVWA-High等级 2、使用Burp生成CSRF利用POC并实现攻击 二、SSRF:file_get_content实验,要求获取ssrf.php的源码 三、RCE 1、 ThinkPHP 2、 Weblogic 3、Shiro...
Excel合并单元格后,如何自动批量生成序号列
1.选择整列 2.组合键:CtrlG 3.定位条件,选择“空值” 4.在第一个框中输入“MAX(”,鼠标选中A1框,后加“:”,鼠标选中前方“A1”,按“F4”绝对引用,补全右括号,后输入“1…...
数据结构 -- B树和B+树
B树 B树 5叉查找树 最少1个关键字,2个分叉 最多4个关键字,5个分叉 如何保证查找效率 (1)eg.对于5叉排序树,规定除了根节点外,任意结点都至少有3个分叉,2个关键字 (若每个结点内关…...
el-table高度自适应、数据查询后高度展示错误问题
在很多场景中我们需要实现表格的高度自适应,即不同屏幕大小下需要使用不同的高度来设置表格,那么我们应该如何实现呢? 1.el-table实现高度自适应 通过以下代码可以实现表格根据屏幕进行自适应 设置表格的高度 <el-table ref"tableD…...
unittest
1.什么是unittest? unittest是Python自带的一个单元测试框架, 它可以做单元测试, 也能用于编写和运行重复的测试工作。它给自动化测试用例开发和执行提供了丰富的断言方法, 判断测试用例是否通过, 并最终生成测试结果. 2.unittest组成 2.1 TestCase TestCase即测试…...
【Linux学习笔记】ext2文件系统的深度剖析
【Linux学习笔记】ext2文件系统的深度剖析 🔥个人主页:大白的编程日记 🔥专栏:Linux学习笔记 文章目录 【Linux学习笔记】ext2文件系统的深度剖析前言一.ext2文件系统1.1宏观认识 二. Block Group三. 块组内部构成3.1 超级块&am…...
Vue 3 官方 Hooks 的用法与实现原理
Vue 3 引入了 Composition API,使得生命周期钩子(hooks)在函数式风格中更清晰地表达。本篇文章将从官方 hooks 的使用、实现原理以及自定义 hooks 的结构化思路出发,全面理解 Vue 3 的 hooks 系统。 📘 1. Vue 3 官方生…...
通过现代数学语言重构《道德经》核心概念体系,形成一个兼具形式化与启发性的理论框架
以下是对《道德经》的数学转述尝试,通过现代数学语言重构其核心概念,形成一个兼具形式化与启发性的理论框架: 0. 基础公理体系 定义: 《道德经》是一个动态宇宙模型 U(D,V,Φ),其中: D 为“道”的无限维…...
openai-whisper-asr-webservice接入dify
openai-whisper-asr-webservice提供的asr的api其实并不兼容openai的api,所以在dify中是不能直接添加到语音转文字的模型中,对比了下两个api的传参情况,其实只要改动一处,就能支持: openai兼容的asr调用中formdata中音频…...
曾经在知乎上看到一个回答:“入职做FPGA,后续是否还可以转数字IC设计?”
曾经在知乎上看到一个回答:“入职做FPGA,后续是否还可以转数字IC设计?” 对比FPGA的行业薪资水平,数字IC行业中的一些基础性岗位薪资比FPGA要高一些。 除了薪资之外,更多FPGA开发者考虑转向数字IC设计的原因如下&…...
第4周_作业题_逐步构建你的深度神经网络
文章目录 ***逐步构建你的深度神经网络***0. 背景0.1 要解决的问题0.2 作业大纲0.3 构建深层神经网络步骤 1. 导入包2. 初始化参数2.1 2层神经网络2.2 L层神经网络 3. 前项传播函数3.1 前项传播步骤3.2 线性前向3.3 线性激活部分3.4 L层前项传播模型3.5 计算成本 4. 反向传播模…...