list的总结
目录
1.什么是list
1.1list 的优势和劣势
优势:
劣势:
2.构造函数
2.1 default (1)
2.2 fill (2)
2.3 range (3)
2.4 copy (4)
3.list iterator的使用
3.1. begin()
3.2. end()
3.3迭代器遍历
4. list容量函数
4.1. empty()
4.2. size()
4.3. max_size()
4.4. front()
4.5. back()
5.list增删查改函数
5.1 push_front
5.2 pop_front
5.3 push_back
5.4 pop_back
5.5 insert
5.6. erase
5.7 swap
5.8 clear
6.list操作函数
6.1. splice
6.2. remove
6.3. unique
6.4. reverse
7.list的迭代器失效
追随光靠近光成为光

1.什么是list
在C++标准库中,list 是一个双向链表容器,用于存储一系列元素。与 vector 和 deque 等容器不同,list 使用链表的数据结构来组织元素,因此在某些操作上具有独特的优势和性能特点。以下是关于 list 的详细介绍
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高 效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率 更好。5. 与其他序列式容器相比,list和forward_list最大的缺陷是不支持任意位置的随机访问,比如:要访问list 的第6个元素,必须从已知的位置(比如头部或者尾部)迭代到该位置,在这段位置上迭代需要线性的时间 开销;list还需要一些额外的空间,以保存每个节点的相关联信息(对于存储类型较小元素的大list来说这 可能是一个重要的因素)
在使用list 时,需要权衡其优势和劣势,根据实际场景来选择合适的容器。当需要频繁插入和删除元素,且不需要随机访问时,list 可能是一个很好的选择。但需要注意的是,由于链表的特性,list 并不适用于需要快速随机访问元素的场景,因为访问某个位置的元素需要遍历链表
1.1list 的优势和劣势
优势:
插入和删除效率高: 由于 std::list 是双向链表,插入和删除操作在常数时间内完成,不需要涉及内存的重新分配和元素的复制。这使得 std::list 在大量插入和删除操作时非常高效。
迭代器的稳定性: std::list 的插入和删除操作不会使迭代器失效,除非删除的正是迭代器所指向的元素。这使得在遍历过程中进行插入和删除操作更加方便和安全。
空间占用相对稳定: std::list 的空间占用相对稳定,插入和删除操作不会影响其他元素的空间占用。
劣势:
不支持随机访问: 由于链表的结构,list 不支持像数组一样的随机访问。访问某个位置的元素需要从链表的开头或结尾开始遍历。
额外的指针开销:list 中的每个元素都需要存储指向前后元素的指针,这使得空间占用相对其他容器更高。
缓存效率低: 由于链表中元素在内存中的存储位置不连续,导致在访问链表元素时,缓存命中率较低,可能影响性能。
迭代器的使用限制:list 的迭代器不支持与普通指针类似的算术操作(如 + 和 -),因此无法像 vector 那样灵活地进行迭代器操作
2.构造函数

2.1 default (1)
这个构造函数用于创建一个空的 std::list 容器。它可以接受一个可选的分配器参数,用于指定内存分配策略。
list<int> v; // 创建一个空的 list 容器
2.2 fill (2)
这个构造函数用于创建一个包含 n 个元素的list 容器,并将这些元素初始化为 val。你可以通过传递不同的 val 值来创建一个包含相同值的容器。同样,也可以传递一个可选的分配器参数。
list<int> v(10, 20); // 创建一个包含 10个元素,每个元素都是 20 的list 容器
2.3 range (3)
这个构造函数使用迭代器范围 [first, last) 中的元素创建一个list 容器。这使你可以通过一个迭代器范围来初始化容器。同样,它也接受一个可选的分配器参数。
vector<int> v = {1, 2, 3, 4, 5};
list<int> my(v.begin(), v.end()); // 从迭代器范围内的元素创建list 容器
2.4 copy (4)
这个构造函数用于创建一个与已存在的 list 容器 x 相同的副本。它会将 x中的所有元素拷贝到新的容器中。这是一个拷贝构造函数。
list<int> v = {1, 2, 3, 4, 5};
list<int> my(v); // 创建一个原容器的副本
3.list iterator的使用
3.1. begin()
iterator begin() noexcept;
这个版本的begin()返回一个迭代器,可以用于修改容器内的元素。noexcept表示这个函数不会抛出异常。
list<int> m = {1, 2, 3, 4, 5};
list<int>::iterator it = m.begin(); // 获取可修改元素的迭代器
*it = 10; // 修改第一个元素的值为 10
3.2. end()
iterator end() noexcept;
这个版本的end()返回一个迭代器,可以用于修改容器内的元素。noexcept表示这个函数不会抛出异常。这个迭代器指向的位置实际上是容器的末尾位置之后一个虚拟的位置,所以它并不指向容器内的任何元素。
list<int> m = {1, 2, 3, 4, 5};
list<int>::iterator it = m.end(); // 获取可修改元素的迭代器
--it; // 将迭代器前移一个位置,指向最后一个元素
*it = 20; // 修改最后一个元素的值为 20
3.3迭代器遍历
(list不支持[ ], 只能用迭代器遍历(范围for也可以底层是迭代器))
#include<iostream>
#include<list>
using namespace std;void mylist()
{list<int> m;m.push_back(1);m.push_back(2);m.push_back(3);//迭代器list<int>::iterator it = m.begin();while (it != m.end()){cout << *it << " ";it++;}cout << endl;//范围forfor (auto e : m){cout << e << " ";}cout << endl;}int main()
{mylist();return 0;
}

4. list容量函数
4.1. empty()
empty() 是 list 容器的一个成员函数,用于判断容器是否为空。它返回一个布尔值,表示容器是否不包含任何元素。函数声明如下:
bool empty() const noexcept;
返回值:如果容器为空,则返回 true,否则返回 false。
例子
#include<iostream>
#include<list>
using namespace std;int main() {list<int> m;if (m.empty()) {cout << "The list is empty." << endl;}else {cout << "The list is not empty." << endl;}m.push_back(10);if (m.empty()) {cout << "The list is empty." << endl;}else {cout << "The list is not empty." << endl;}return 0;
}

4.2. size()
size() 是 list 容器的一个成员函数,用于返回容器中元素的数量。它返回一个无符号整数类型,表示容器中的元素数量。函数声明如下:
size_type size() const noexcept;返回值:返回容器中元素的数量,即大小。
#include<iostream>
#include<list>
using namespace std;int main() {list<int> m;m.push_back(1);m.push_back(2);m.push_back(3);m.push_back(4);m.push_back(5);cout << "Size of the list: " << m.size() << endl;return 0;
}

4.3. max_size()
max_size() 是 list 容器的一个成员函数,用于返回容器可能容纳的最大元素数量,通常受到系统内存限制的影响。它返回一个无符号整数类型,表示容器的最大大小。函数签名如下:
size_type max_size() const noexcept;
返回值:返回容器可能容纳的最大元素数量。
#include<iostream>
#include<list>
using namespace std;int main() {list<int> m;cout << "Size of the list: " << m.max_size() << endl;return 0;
}

4.4. front()
front() 是 list 容器的成员函数,用于返回容器中第一个元素的引用。这个函数有两个版本,一个用于可修改容器的对象,另一个用于只读(const)容器的对象。函数的签名如下:
reference front();reference:返回一个对容器中第一个元素的非常引用。
加了const是只读的不能被修改
#include<iostream>
#include<list>
using namespace std;int main()
{list<int> m = {9,2,3,4,5,6};int& firstElement = m.front();cout << "First element: " << m.front() << endl;return 0;
}

4.5. back()
back() 是 list 容器的成员函数,用于返回容器中最后一个元素的引用。这个函数有两个版本,一个用于可修改容器的对象,另一个用于只读(const)容器的对象。函数的签名如下:
reference back();
reference:返回一个对容器中最后一个元素的非常引用。加了const是只读的不能被修改
#include<iostream>
#include<list>
using namespace std;int main()
{list<int> m = {9,2,3,4,5,6};int& firstElement = m.back();cout << "Last element: " << m.back() << endl;return 0;
}

5.list增删查改函数
| 函数说明 | 接口说明 |
| push_front | 在list首元素前插入值为val的元素 |
| pop_front | 删除list中第一个元素 |
| push_back | 在list尾部插入值为val的元素 |
| pop_back | 删除list中最后一个元素 |
| insert | 在list position 位置中插入值为val的元素 |
| erase | 删除list position位置的元素 |
| swap | 交换两个list中的元素 |
| clear | 清空list中的有效元素 |
5.1 push_front
push_front 是 list 容器的成员函数,用于在容器的开头插入一个新元素。
这个函数有两个版本:
void push_front (const value_type& val);:接受一个常量引用参数,会创建一个新元素并将参数的值拷贝到新元素中。
void push_front (value_type&& val);:接受一个右值引用参数,用于移动构造一个新元素。这样可以避免额外的拷贝操作,提高了效率。
#include<iostream>
#include<list>
using namespace std;int main()
{list<int> m;int value = 10;m.push_front(value); // Copy insertcout << "List contents:" << endl;for (const auto& num : m) {cout << num << " ";}cout << endl;m.push_front(20); // Move insert,右值引用,更简单高效cout << "List contents after move insert:" << endl;for (const auto& num : m) {cout << num << " ";}cout << endl;return 0;
}

5.2 pop_front
void pop_front(); 是用于从 ist 的开头移除一个元素的成员函数。它会删除列表中的第一个元素,并且将列表的大小减小一个单位。
#include<iostream>
#include<list>
using namespace std;int main()
{list<int> m = {10,20,30,40,50};m.pop_front();for (auto e : m){cout << e << " ";}cout << endl;return 0;
}

5.3 push_back
void push_back (const value_type& val); 是 list 容器的成员函数,用于在列表的末尾插入一个新元素。它接受一个常量引用作为参数,将传入的值插入到列表末尾
#include<iostream>
#include<list>
using namespace std;int main()
{list<int> m;m.push_back(2);m.push_back(4);m.push_back(6);m.push_back(8);m.push_back(10);for (auto e : m){cout << e << " ";}cout << endl;return 0;
}

5.4 pop_back
void pop_back(); 是 list 容器的成员函数,用于删除列表中的最后一个元素。它会将列表的最后一个元素从容器中移除,同时释放相应的内存资源。
#include<iostream>
#include<list>
using namespace std;int main()
{list<int> m;m.push_back(2);m.push_back(4);m.push_back(6);m.push_back(8);m.push_back(10);m.pop_back();m.pop_back();list<int>::iterator it = m.begin();while (it != m.end()){cout<<*it<<" ";it++;}cout << endl;return 0;
}

5.5 insert
在list position 位置中插入值为val的元素
iterator insert (iterator position, const value_type& val); 是 list 容器的成员函数,用于在指定位置插入一个新元素,新元素的值由 val 参数确定。
参数说明:
position:要插入新元素的位置的迭代器。
val:要插入的元素的值。
该函数返回一个迭代器,指向插入的元素。
#include<iostream>
#include<list>
using namespace std;int main()
{list<int> m = {1,2,3,4,5};auto a = m.begin();a++; //begin的下一个位置,第二个位置m.insert(a,10);list<int>::iterator it = m.begin();while (it != m.end()){cout<<*it<<" ";it++;}cout << endl;return 0;
}

5.6. erase
删除list position位置的元素
iterator erase (iterator position); 和 iterator erase (iterator first, iterator last); 是 std::list 容器的成员函数,用于从列表中删除一个或多个元素。
iterator erase (iterator position); 删除指定位置的元素,并返回指向下一个元素的迭代器。
参数说明:
position:要删除的元素的位置的迭代器。
返回值:指向被删除元素之后的元素的迭代器。
#include<iostream>
#include<list>
using namespace std;int main()
{list<int> m = {1,2,3,4,5};auto a = m.begin();a++; //begin的下一个位置,第二个位置m.erase(a);
}

5.7 swap
交换两个list中的元素
#include<iostream>
#include<list>
using namespace std;int main()
{list<int> m = {1,2,3,4,5};list<int> n = { 6,7,8,9,0};m.swap(n);list<int>::iterator it = m.begin();cout << "m:";;while (it != m.end()){cout << *it << " ";it++;}cout << endl;list<int>::iterator is = n.begin();cout << "n:";while (is != n.end()){cout << *is << " ";is++;}cout << endl;return 0;
}

5.8 clear
清空list中的有效元素
#include<iostream>
#include<list>
using namespace std;#include <iostream>
#include <list>int main() {list<int> m = { 1, 2, 3, 4, 5 };cout << "m before clear: ";for (int num : m) {cout << num << " ";}cout << endl;m.clear(); // 清空列表cout << "m after clear: ";for (int num : m) {cout << num << " ";}cout << endl;return 0;
}

6.list操作函数
6.1. splice
void splice (iterator position, list& x);
该成员函数用于将另一个列表 x 中的所有元素移动到当前列表中,插入到指定位置 position 前。x 列表在移动后会变为空列表。
#include<iostream>
#include<list>
using namespace std;int main() {list<int> m1 = { 1, 2, 3 };list<int> m2 = { 4, 5, 6 };auto it = m1.begin();advance(it,1); m1.splice(it, m2); // 将 m2 的元素插入到 m1 中cout << "m1 after splice: ";for (int num : m1) {cout << num << " ";}cout << endl;cout << "m2 after splice: ";for (int num : m2) {cout << num << " ";}cout << endl;return 0;
}

6.2. remove
void remove (const value_type& val);
该成员函数用于从列表中移除所有等于给定值 val 的元素。
#include<iostream>
#include<list>
using namespace std;int main() {list<int> m = { 1, 2, 3, 2, 4, 2, 5 };m.remove(2); // 移除列表中所有值为 2 的元素cout << "m after remove: ";for (int num : m) {cout << num << " ";}cout << endl;return 0;
}

6.3. unique
void unique();
这个成员函数用于移除列表中相邻的重复元素。它只保留第一个出现的重复元素,移除后续的重复元素。
#include<iostream>
#include<list>
using namespace std;int main() {list<int> m = { 1, 2, 2, 2, 3, 4,4, 5 };m.unique( ); // 移除列表中所有值为 2 的元素cout << "m after remove: ";for (int num : m) {cout << num << " ";}cout << endl;return 0;
}

6.4. reverse
void reverse(); 函数用于将列表中的元素逆序排列。
#include<iostream>
#include<list>
using namespace std;int main() {list<int> m = { 1, 2,3,4, 5 };m.reverse( ); // 移除列表中所有值为 2 的元素cout << "m after remove: ";for (int num : m) {cout << num << " ";}cout << endl;return 0;
}

7.list的迭代器失效
迭代器失效即迭代器所指向的节点的无效,即该节点被删除了。因为list的底层结构为带头结点的双向循环链表,因此在list中进行插入时是不会导致list的迭代器失效的,只有在删除时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响。
当使用 std::list 进行删除操作时,可能会导致迭代器失效。下面是一个示例:
#include<iostream>
#include<list>
using namespace std;int main() {list<int> m = { 1, 2, 3, 4, 5 };auto it = m.begin();++it; // Move the iterator to the second elementm.erase(it); // Erase the second elementfor (auto n : m) {cout << n << " ";}return 0;
}
在上面的示例中,当我们在第二个元素位置处使用 erase 函数删除元素后,迭代器 it 就会失效,因为它指向的元素已经被删除。如果我们尝试使用失效的迭代器,可能会导致未定义的行为
要修正这个问题,可以使用 erase 函数的返回值,它会返回一个指向下一个有效元素的迭代器:
#include<iostream>
#include<list>
using namespace std;int main() {list<int> m = { 1, 2, 3, 4, 5 };auto it = m.begin();++it; // Move the iterator to the second elementit=m.erase(it); // Erase the second elementfor (auto n : m) {cout << n << " ";}return 0;
}
本文章借鉴了「爱学习的鱼佬」的原创文章,原文在下面链接
原文链接:https://blog.csdn.net/kingxzq/article/details/132225841
相关文章:
list的总结
目录 1.什么是list 1.1list 的优势和劣势 优势: 劣势: 2.构造函数 2.1 default (1) 2.2 fill (2) 2.3 range (3) 2.4 copy (4) 3.list iterator的使用 3.1. begin() 3.2. end() 3.3迭代器遍历 4. list容量函数 4.1. empty() 4.2. siz…...
c语言数字转圈
数字转圈 题干输入整数 N(1≤N≤9),输出如下 N 阶方阵。 若输入5显示如下方阵: * 1** 2** 3** 4** 5* *16**17**18**19** 6* *15**24**25**20** 7* *14**23**22**21** 8* *13**12**11**10** 9*输入样例3输出样例* 1*…...
Apache Superset数据分析平台如何实现公网实时远程访问数据【内网穿透】
文章目录 前言1. 使用Docker部署Apache Superset1.1 第一步安装docker 、docker compose1.2 克隆superset代码到本地并使用docker compose启动 2. 安装cpolar内网穿透,实现公网访问3. 设置固定连接公网地址 前言 Superset是一款由中国知名科技公司开源的“现代化的…...
HarmonyOS应用开发实战—登录页面【ArkTS】
文章目录 本页面实战效果预览图一.HarmonyOS应用开发1.1HarmonyOS 详解1.2 ArkTS详解二.HarmonyOS应用开发实战—登录页面【ArkTS】2.1 ArkTS页面源码2.2 代码解析2.3 心得本页面实战效果预览图 一.HarmonyOS应用开发 1.1HarmonyOS 详解 HarmonyOS(鸿蒙操作系统)是华为公司…...
@RequestMapping
目录 作用: 位置: 属性 1.value 2.method 3.params 4.header 作用: 该注解是一个用来处理请求地址映射的注解。 位置: 可用于映射一个请求或一个方法,可以用在类或方法上。 用于方法上,表示在类的…...
操作系统 应用题 例题+参考答案(考研真题)
1.(考研真题)一个多道批处理系统中仅有P1和P2两个作业,P2比P1晚5ms到达,它们的计算和I/O操作顺序如下。 P1:计算60ms,I/O 80ms,计算20ms。 P2:计算120ms,I/O 40ms&…...
免费获取GPT-4的五种工具
不可否认,由OpenAI带来的GPT-4已是全球最受欢迎的、功能最强大的大语言模型(LLM)之一。大多数人都需要使用ChatGPT Plus的订阅服务去访问GPT-4。为此,他们通常需要每月支付20美元。那么问题来了,如果您不想每月有这笔支…...
XTU OJ 1146 矩阵乘法学习笔记
原题 题目描述 给你两个矩阵A(n*k),B(k*m),请求A*B。 输入 第一行是一个整数K,表示样例的个数。 每个样例包含两个矩阵A和B。 每个矩阵的第一行是两个整数n,m,(1≤n,m≤10)表示矩阵的行和列 以后的n行,每行m个整数,每个整数的绝对值不超过…...
基于官方YOLOv4开发构建目标检测模型超详细实战教程【以自建缺陷检测数据集为例】
本文是关于基于YOLOv4开发构建目标检测模型的超详细实战教程,超详细实战教程相关的博文在前文有相应的系列,感兴趣的话可以自行移步阅读即可:《基于yolov7开发实践实例分割模型超详细教程》 《YOLOv7基于自己的数据集从零构建模型完整训练、…...
1、Docker概述与安装
相关资源网站: ● docker官网:http://www.docker.com ● Docker Hub仓库官网: https://hub.docker.com/ 注意,如果只是想看Docker的安装,可以直接往下拉跳转到Docker架构与安装章节下的Docker具体安装步骤,一步步带你安…...
论文笔记——FasterNet
为了设计快速神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,作者观察到FLOPs的这种减少不一定会带来延迟的类似程度的减少。这主要源于每秒低浮点运算(FLOPS)效率低下。 为了实现更快的网络,作者重新回顾了FLOPs的运算符,并证明了如此低的FLOPS主要是由…...
计算机组成原理-固态硬盘SSD
文章目录 总览机械硬盘vs固态硬盘固态硬盘的结构固态硬盘与机械硬盘相比的特点磨损均衡技术例题 总览 机械硬盘vs固态硬盘 固态硬盘采用闪存技术,是电可擦除ROM 下图右边黑色的块块就是一块一块的闪存芯片 固态硬盘的结构 块大小16KB~512KB 页大小512B~4KB 对固…...
Electron+VUE3开发简版的编辑器【文件预览】
简版编辑器的功能主要是: 打开对话框,选择文件后台读取文件文件前端展示文件内容。主要技术栈是VUE3、Electron和Nodejs,VUE3做页面交互,Electron提供一个可执行Nodejs的环境以及支撑整个应用的环境,nodeJS负责读取文件内容。 环境配置、安装依赖这些步骤就不再叙述了。 …...
docker、elasticsearch8、springboot3集成备忘
目录 一、背景 二、安装docker 三、下载安装elasticsearch 四、下载安装elasticsearch-head 五、springboot集成elasticsearch 一、背景 前两年研究了一段时间elasticsearch,当时也是网上找了很多资料,最后解决个各种问题可以在springboot上运行了…...
【Lombok使用详解】
目录 前言:注解速查1.Lombok概念2.安装Lombok3. 使用Lombok3.1 😊Data3.2 GetterSetter3.3 NonNull3.4 Synchronized3.5 ToString:自动生成toString()方法3.6 Cleanup3.7 EqualsAndHashCode 前言:注解速查 NonNull : 用在成员方法…...
Tars框架 Tars-Go 学习
Tars 框架安装 网上安装教程比较多,官方可以参数这个 TARS官方文档 (tarsyun.com) 本文主要介绍部署应用。 安装完成后Tars 界面 增加应用amc 部署申请 amc.GoTestServer.GoTestObj 名称不知道的可以参考自己创建的app config 点击刷新可以看到自己部署的应用 服…...
基于JAVA+SpringBoot+VUE+微信小程序的前后端分离咖啡小程序
✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着社会的快速发展和…...
2015年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版
文章目录 2015 级考研管理类联考数学真题一、问题求解(本大题共 15 小题,每小题 3 分,共 45 分)下列每题给出 5 个选项中,只有一个是符合要求的,请在答题卡上将所选择的字母涂黑。真题(2015-01&…...
优秀软件设计特征与原则
1.摘要 一款软件产品好不好用, 除了拥有丰富的功能和人性化的界面设计之外, 还有其深厚的底层基础, 而设计模式和算法是构建这个底层基础的基石。好的设计模式能够让产品开发快速迭代且稳定可靠, 迅速抢占市场先机;而好的算法能够让产品具有核心价值, 例如字节跳动…...
设备管理系统-设备管理软件
一、为什么要使用设备管理系统 1.企业扩张快,设备配置多,管理混乱。 2.设备数量多,存放地点多,查找麻烦。 3.同类设备单独管理, 困难。 4.设备较多时相关信息统计容易出错,错误后修改困难。 二、凡尔码设备管理软件的…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
