C++ STL 详解 ——list 的深度解析与实践指南
在 C++ 的标准模板库(STL)中,list
作为一种重要的序列式容器,以其独特的双向链表结构和丰富的操作功能,在许多编程场景下发挥着关键作用。深入理解list
的特性与使用方法,能帮助开发者编写出更高效、灵活的代码。
一、list 的结构特点
list
的底层是双向链表结构,这意味着每个元素都存储在独立的结点中,每个结点通过指针分别指向其前一个元素和后一个元素。这种结构使得list
在任意位置进行插入和删除操作时,都能在常数时间内完成,效率极高。例如,当需要在链表中间插入一个新元素时,只需修改相关指针的指向,无需像数组那样移动大量元素。同时,双向链表的结构还支持前后双向迭代,方便从两个方向遍历容器。
与forward_list
相比,list
的双向链表结构虽然在功能上更强大,但也带来了一些额外的开销。由于每个结点都需要额外的空间来存储前后指针,对于存储类型较小的元素,这些额外空间的占用可能会对内存使用产生较大影响。而且,与数组和向量不同,list
不支持随机访问,不能通过下标直接访问特定位置的元素,这在一些需要频繁随机访问的场景下会带来不便。
二、list 的使用方法
(一)定义方式
list
提供了多种灵活的定义方式。可以构造一个空容器,如list<int> lt1;
,用于后续动态添加元素。也能创建一个包含指定数量且值相同的元素的容器,像list<int> lt2(10, 2);
,这里的lt2
就包含了 10 个值为 2 的元素。通过拷贝构造,能复制已有容器的内容,list<int> lt3(lt2);
将lt2
的内容复制到lt3
中。此外,还可以利用迭代器或数组区间来初始化list
,例如:
#include <iostream>
#include <list>
#include <string>
using namespace std;int main() {list<int> lt1;list<int> lt2(10, 2);list<int> lt3(lt2);string s("hello world");list<char> lt4(s.begin(), s.end()); int arr[] = { 1, 2, 3, 4, 5 };int sz = sizeof(arr) / sizeof(int);list<int> lt5(arr, arr + sz); // 打印各个list的内容cout << "lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;cout << "lt2: ";for (int i : lt2) {cout << i << " ";}cout << endl;cout << "lt3: ";for (int i : lt3) {cout << i << " ";}cout << endl;cout << "lt4: ";for (char c : lt4) {cout << c << " ";}cout << endl;cout << "lt5: ";for (int i : lt5) {cout << i << " ";}cout << endl;return 0;
}
(二)插入和删除操作
- 头部操作:
push_front
和pop_front
函数分别用于在容器头部插入和删除元素。这在需要频繁在头部添加或删除数据的场景下非常实用,比如实现一个栈结构时,就可以利用list
的这些操作。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt;lt.push_front(1);lt.push_front(2);cout << "After push_front, list: ";for (int i : lt) {cout << i << " ";}cout << endl;lt.pop_front();cout << "After pop_front, list: ";for (int i : lt) {cout << i << " ";}cout << endl;return 0;
}
- 尾部操作:
push_back
和pop_back
函数则用于在容器尾部进行插入和删除操作,在实现队列结构时经常会用到。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt;lt.push_back(1);lt.push_back(2);cout << "After push_back, list: ";for (int i : lt) {cout << i << " ";}cout << endl;lt.pop_back();cout << "After pop_back, list: ";for (int i : lt) {cout << i << " ";}cout << endl;return 0;
}
- 指定位置操作:
insert
函数支持在指定迭代器位置进行多种插入操作,包括插入一个数、插入多个相同值的数以及插入一段迭代器区间。erase
函数可以删除指定迭代器位置的元素或指定迭代器区间内的所有元素。在使用这些函数时,通常会结合<algorithm>
头文件中的find
函数来定位要操作的位置。
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;int main() {list<int> lt = { 1, 2, 3, 4, 5 };auto it = find(lt.begin(), lt.end(), 3);if (it != lt.end()) {lt.insert(it, 10); // 在找到的元素3前插入10cout << "After insert, list: ";for (int i : lt) {cout << i << " ";}cout << endl;lt.erase(it); // 删除元素3cout << "After erase, list: ";for (int i : lt) {cout << i << " ";}cout << endl;}return 0;
}
(三)迭代器使用
list
的迭代器分为正向迭代器和反向迭代器。通过begin
函数获取容器中第一个元素的正向迭代器,end
函数获取最后一个元素后一个位置的正向迭代器,利用正向迭代器可以从前往后遍历容器。而rbegin
和rend
函数分别返回容器中最后一个元素的反向迭代器和第一个元素前一个位置的反向迭代器,方便从后往前遍历容器。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt = { 1, 2, 3, 4, 5 };// 正向迭代器遍历cout << "Forward iteration: ";for (auto it = lt.begin(); it != lt.end(); ++it) {cout << *it << " ";}cout << endl;// 反向迭代器遍历cout << "Reverse iteration: ";for (auto it = lt.rbegin(); it != lt.rend(); ++it) {cout << *it << " ";}cout << endl;return 0;
}
(四)元素获取与大小控制
使用front
和back
函数可以轻松获取list
容器中的第一个和最后一个元素。size
函数用于获取容器中当前元素的个数,resize
函数能够调整容器的大小,根据传入参数的不同,实现扩大或缩小容器。empty
函数用于判断容器是否为空,clear
函数则可以清空容器中的所有元素。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt = { 1, 2, 3, 4, 5 };cout << "前元素: " << lt.front() << endl;cout << "返回元素: " << lt.back() << endl;cout << "列表大小: " << lt.size() << endl;lt.resize(3); // 缩小容器大小为3cout << "调整大小后,列表的大小: " << lt.size() << endl;if (lt.empty()) {cout << "列表为空" << endl;}else {cout << "列表不是空的" << endl;}lt.clear();if (lt.empty()) {cout << "清除后,列表为空" << endl;}else {cout << "清除后,列表不为空" << endl;}return 0;
}
(五)其他操作函数
- 排序与拼接:
sort
函数可以将容器中的数据默认排为升序,在对数据顺序有要求时十分便捷。splice
函数用于两个list
容器之间的拼接,有多种拼接方式,可以将整个容器、某个元素或指定区间的数据拼接到另一个容器的指定位置,但要注意被拼接的数据会从原容器中移除。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt1 = { 3, 1, 2 };list<int> lt2 = { 6, 4, 5 };lt1.sort();cout << "After sorting lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;lt1.splice(lt1.end(), lt2); // 将lt2拼接到lt1的末尾cout << "After splice, lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;return 0;
}
- 元素删除与去重:
remove
函数用于删除容器中特定值的元素,remove_if
函数则可以删除满足特定条件的元素,unique
函数用于删除容器中连续的重复元素,不过在使用unique
函数去重前,通常需要先对容器内元素进行排序。
#include <iostream>
#include <list>
#include <algorithm>
using namespace std;bool isEven(int num) {return num % 2 == 0;
}int main() {list<int> lt = { 1, 2, 2, 3, 4, 4, 5 };lt.remove(2); // 删除值为2的元素cout << "After remove 2, list: ";for (int i : lt) {cout << i << " ";}cout << endl;lt.remove_if(isEven); // 删除偶数元素cout << "After remove_if, list: ";for (int i : lt) {cout << i << " ";}cout << endl;lt = { 1, 2, 2, 3, 3, 3 };lt.sort();lt.unique(); // 去重cout << "After unique, list: ";for (int i : lt) {cout << i << " ";}cout << endl;return 0;
}
- 合并与其他操作:
merge
函数用于将一个有序list
容器合并到另一个有序list
容器中,合并后容器依然保持有序。reverse
函数用于逆置容器中元素的位置,assign
函数可以用新内容替换容器的当前内容,swap
函数用于交换两个容器的内容。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> lt1 = { 1, 3, 5 };list<int> lt2 = { 2, 4, 6 };lt1.merge(lt2); // 合并lt2到lt1cout << "After merge, lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;lt1.reverse(); // 逆置lt1cout << "After reverse, lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;list<int> lt3 = { 7, 8, 9 };lt1.assign(lt3.begin(), lt3.end()); // 用lt3的内容替换lt1cout << "After assign, lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;list<int> lt4 = { 10, 11, 12 };lt1.swap(lt4); // 交换lt1和lt4的内容cout << "After swap, lt1: ";for (int i : lt1) {cout << i << " ";}cout << endl;return 0;
}
三、应用场景
- 数据频繁插入和删除:在实现一些需要频繁进行插入和删除操作的数据结构时,如优先队列、缓存管理等,
list
的高效插入和删除特性使其成为理想选择。例如,在缓存管理中,当有新数据进入缓存或旧数据被淘汰时,list
能够快速调整数据顺序。
#include <iostream>
#include <list>
using namespace std;class Cache {
private:list<int> cacheList;int capacity;public:Cache(int cap) : capacity(cap) {}void access(int data) {for (auto it = cacheList.begin(); it != cacheList.end(); ++it) {if (*it == data) {cacheList.erase(it);cacheList.push_front(data);return;}}if (cacheList.size() >= capacity) {cacheList.pop_back();}cacheList.push_front(data);}void printCache() {for (int i : cacheList) {cout << i << " ";}cout << endl;}
};int main() {Cache cache(3);cache.access(1);cache.access(2);cache.access(3);cache.printCache();cache.access(2);cache.printCache();cache.access(4);cache.printCache();return 0;
}
- 链表相关算法实现:由于
list
本身就是基于双向链表结构,在实现链表相关的算法,如链表的反转、合并等时,直接使用list
容器可以简化代码编写,并且能充分利用其内置的操作函数。
#include <iostream>
#include <list>
using namespace std;int main() {list<int> list1 = { 1, 2, 3 };list<int> list2 = { 4, 5, 6 };// 合并两个listlist1.merge(list2);cout << "After merging, list1: ";for (int i : list1) {cout << i << " ";}cout << endl;// 反转list1list1.reverse();cout << "After reversing, list1: ";for (int i : list1) {cout << i << " ";}cout << endl;return 0;
}
- 内存管理优化:在一些对内存使用有严格要求的场景下,如果数据元素之间的顺序关系较为灵活,且不需要频繁随机访问,
list
的动态内存分配和释放特性可以有效避免内存碎片问题,提高内存利用率。
list
作为 C++ STL 中的重要容器,以其独特的双向链表结构和丰富的操作函数,在众多编程场景中都有着不可替代的作用。开发者在实际编程中,应根据具体需求,合理选择使用list
,充分发挥其优势,提升程序的性能和质量。
相关文章:
C++ STL 详解 ——list 的深度解析与实践指南
在 C 的标准模板库(STL)中,list作为一种重要的序列式容器,以其独特的双向链表结构和丰富的操作功能,在许多编程场景下发挥着关键作用。深入理解list的特性与使用方法,能帮助开发者编写出更高效、灵活的代码…...
open函数的概念和使用案例
open 是 Linux/Unix 系统中用于打开或创建文件的系统调用,返回一个文件描述符(File Descriptor),后续可通过该描述符进行文件读写等操作。以下是其核心概念和使用案例的详细说明: 1. 核心概念 作用:打开或…...
整理一些大模型部署相关的知识
不一定有什么用, 不经常用还会忘掉. 之前被人问到一次,脑子卡壳回答不出要点, 非常尴尬! 在此记录一下使用心得, 偶尔回来翻看! 一 并行方式 1.1 数据并行 (Data Parallelism) 主要用于模型训练阶段, 即将多个完整的模型副本分布到多个gpu上, 每个gpu运行一部分数据数据, 每个…...
算法刷题记录——LeetCode篇(2.10) [第191~200题](持续更新)
更新时间:2025-04-04 算法题解目录汇总:算法刷题记录——题解目录汇总技术博客总目录:计算机技术系列博客——目录页 优先整理热门100及面试150,不定期持续更新,欢迎关注! 198. 打家劫舍 你是一个专业的…...
蓝桥杯备赛 Day 19 加练dfs
是否需要回溯? 输入参数有哪几个(当前dfs和下一个dfs什么会变?)? 是否需要返回值? 一.1158: 八皇后 P1158 - 八皇后 - New Online Judge (ecustacm.cn) 学习: 1.dfs输入为层数,即行号i,因为是每行只放一个,下一个dfs就是i1 2…...
蓝桥杯-卡java排序
问题描述 本题是一道针对 Java 中 Arrays.sort 的题目,因此只有一个数据,该数据可以把 int 类型的数组在使用 Arrays.sort 后卡成 O(n2)O(n2)。 给定一个有 nn 个正整数的序列 aa,你需要将其升序排序后输出。 输入格式 第一行输入一个正整…...
内存管理模块
在 Linux 内核中,内存管理是一个复杂而关键的组成部分。内核空间的虚拟地址被划分为多个区域,每个区域有其特定的用途和映射机制。本文将详细介绍 直接映射区(Direct Mapping Area)、vmalloc 区、永久内核映射区(Perma…...
Spring RestTemplate修仙指南:从HTTP萌新到请求大能的终极奥义
各位在Spring生态摸爬滚打的道友们!今天要解锁的是Spring官方御用HTTP法宝——RestTemplate!这货堪称Java界的"御剑飞行术",虽然官方已推荐WebClient接棒,但江湖上仍有80%项目在用这员老将!准备好一键起飞了…...
cpp经典数论问题
题目如下 思路 代码如下...
Redis 线程模型:单线程也能快如闪电?
目录 一、核心思想:快刀斩乱麻的“单线程”高手 🦸♂️二、为什么是“单线程”?🤔三、单线程如何做到高性能?✨ “I/O 多路复用”是关键!四、真的一直都只有“一个线程”吗?并不完全是&#x…...
游戏引擎学习第208天
运行游戏并回顾我们的情况 今天,我们将继续完成之前中断的调试输出工作。最近的工作偏离了一些,展示了如何进行元编程的实践,主要涉及了一个小的解析器。尽管这个解析器本身是一个玩具,但它展示了如何完成一个完整的循环…...
JavaScript箭头函数介绍(=>)(箭头函数不绑定自己的this,而是继承上下文的this;不能用于造函数)JavaScript =>
文章目录 JavaScript箭头函数全解析箭头函数的基本语法简洁语法特性隐式返回值对象字面量返回 词法绑定的this不适用箭头函数的场景对象方法构造函数DOM事件处理 高级用法在数组方法中的应用链式调用柯里化函数 性能考量1. 作为回调函数时减少创建闭包的开销2. 简化代码结构&am…...
数据对象:DTO、DO、PO和 BO的区别和关系
在Java开发中,DTO(Data Transfer Object)、DO(Domain Object)、PO(Persistent Object)和BO(Business Object)是常用的数据对象概念,下面为你详细介绍并给出简…...
Java内存模型详解:堆、栈、方法区
1. 堆(Heap) 作用:存放所有对象实例及数组,是垃圾回收的主要区域。 结构: 新生代(Young Generation): Eden区:新创建的对象首先分配在此。 Survivor区(From…...
ubuntu 20.04 编译运行LeGo_LOAM 跑数据集 并且保存pcl文件
1.搭建文件目录,clone代码,编译 mkdir -p Lego_LOAM/src cd Lego_LOAM/src git clone https://github.com/RobustFieldAutonomyLab/LeGO-LOAM.git cd .. catkin_make -j1 错误1:: fatal error: opencv/cv.h: 没有那个文件或目录 13 | #include <opencv/cv.h…...
CMake使用教程
CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。 使用命令行执行CMakeLists.txt,对文件进…...
快速上手Linux进程管理
一.理解进程和线程 1.1 什么是进程 它表示一个正在执行的程序实例。在操作系统中,进程是系统进行资源分配和调度的基本单位。每个进程都有自己独立的内存空间、代码、数据和系统资源,如打开的文件、使用的硬件设备等。 进程的主要特点包括:…...
pytorch框架实现cnn四种天气图片多分类问题-添加dropout和bn层
目录 1.导包 2.加载数据、拼接训练、测试文件夹 3. 查看当前目录下的所有文件名,以列表的形式输出 4.原数据集dataset中存在的数据的目标类别 5.创建train和test目录 及其需要分类的子文件夹 6.使用torchvision 的transforms进行数据预处理 6.1数据统一缩放resize、To…...
swift-11-init、deinit、可选链、协议、元类型
一、required 二、属性观察器 三、可失败初始化器 可以用init!定义隐式解包的可失败初始化器 可失败初始化器可以调用非可失败初始化器,非可失败初始化器调用可失败初始化器需要进行解包 如果初始化器调用一个可失败初始化器导致初始化失败 ,那么整个初…...
【力扣hot100题】(062)搜索插入位置
感觉自己对二分法还是没有很好掌握,主要在于边界问题,只会基本的搜索,如果要搜索比目标值大的第一个索引或者比目标值小的最后一个索引(或者换一些花里胡哨的题目)就完全不会了。 class Solution { public:int search…...
TCPIP详解 卷1协议 三 链路层
3.1——以太网和IEEE802局域网/城域网标准 以太网这个术语通常指一套标准,由DEC,Intel公司和Xerox公司在1980年首次发布,并在1982年加以修订。第一个常见格式的以太网,目前被称为10Mb/s以太网或共享以太网。它被IEEE采纳为802.3标…...
以太网安全
前言: 端口隔离可实现同一VLAN内端口之间的隔离。用户只需要将端口加入到隔离组中,就可以实现隔离组内端口之间的二层数据的隔离端口安全是一种在交换机接入层实施的安全机制,旨在通过控制端口的MAC地址学习行为,确保仅授权设备能…...
linux如何查看当前系统的资源占用情况
在 Linux 系统中,有多个命令可以查看当前系统的资源占用情况。以下是一些常用的命令及其说明: 1. 查看内存使用情况:free free -h-h 参数表示以人类可读的格式显示(如 MB, GB)。输出示例: to…...
人脸识别系统(人脸识别、前后端交互、Python项目)
基于Flask、Face_Recognition的人脸识别系统 项目介绍 基于flask、face_recognition的人脸识别系统。 本项目采用Face_Recognition库内置的ResNet-34预训练模型,其已对LFW公开数据集进行预训练而得到的模型。利用ResNet-34预训练模型,可使用少量已知人…...
2025 ArkTS语言开发入门之前言(二)
2025 ArkTS语言开发入门之前言(二) 前言 在上一节,咱们学习了如何下载并安装ArkTS的集成开发环境,这时候有的臭宝会发现,左边的这些叽里咕噜的是什么?下面,我来带着臭宝们来学习一下这些是什么…...
VLAN(虚拟局域网)
一、vlan概述 VLAN(virtual local area network)是一种通过逻辑方式划分网络的技术,允许将一个物理网络划分为多个独立的虚拟网络。每一个vlan是一个广播域,不同vlan之间的通信需要通过路由器或三层交换机 [!注意] vlan是交换机独有的技术,P…...
2025.4.6总结
今日记录:今天玩的有些累,先是去护肤店护理了脸部,然后去汉口江滩那看了看美景,吹吹江风。节假日去玩,光是挤一个半小时地铁都感觉累。还好上下班期间不用挤地铁,不然还真受不了。 假期小结 1.消费&#…...
【清明折柳】写在扬马三周目后
黄绿之间,方寸之外。 文章目录 楔子解耦到离散螃蟹与毒药文本的力量朝花夕拾后记 楔子 “——就像物理学家通过演绎与归纳将宏微世界的运转规律浓缩到数学公式中时,如今的人工智能也在试图量化整个人类文明。” “——只是,使用的是昂贵、笨…...
P1258 小车问题(二分)
题目描述 甲、乙两人同时从 A 地出发要尽快同时赶到 B 地。出发时 A 地有一辆小车,可是这辆小车除了驾驶员外只能带一人。已知甲、乙两人的步行速度一样,且小于车的速度。问:怎样利用小车才能使两人尽快同时到达。 输入格式 仅一行&#x…...
一个基于ragflow的工业文档智能解析和问答系统
工业复杂文档解析系统 一个基于ragflow的工业文档智能解析和问答系统,支持多种文档格式的解析、知识库管理和智能问答功能。 系统功能 1. 文档管理 支持多种格式文档上传(PDF、Word、Excel、PPT、图片等)文档自动解析和分块处理实时处理进度显示文档解析结果预览批量文档…...
负指数二项式展开
转载:负指数二项式展开_二项式负数次幂的展开式-CSDN博客...
CentOS 7服务器上快速安装mamba函数库
本次预配置虚拟环境为cuda 11.8torch 2.2.2python 3.10 1. 创建conda虚拟环境:conda create -n mamba python3.10 激活环境:conda activate mamba 2. 安装Pytorch环境: conda install pytorch2.2.2 torchvision0.17.2 torchaudio2.2.2 py…...
ResNet改进(18):添加 CPCA通道先验卷积注意力机制
1. CPCA 模块 CPCA(Channel Prior Convolutional Attention)是一种结合通道先验信息的卷积注意力机制,旨在通过显式建模通道间关系来增强特征表示能力。 核心思想 CPCA的核心思想是将通道注意力机制与卷积操作相结合,同时引入通道先验知识,通过以下方式优化特征学习: 通…...
代码随想录算法训练营--打卡day6
一.四数相加 1.题目链接 454. 四数相加 II - 力扣(LeetCode) 2.思路 使用 HashSet 无法记录每种和出现的次数,当不同的 (nums1[i], nums2[j]) 组合得到相同的和时,会出现统计错误。这里应该使用 HashMap 来记录和以及其出现的…...
edge webview2 runtime跟Edge浏览器软件安装包双击无反应解决方法
软件安装报错问题有需要远程文章末尾获取联系方式,可以帮你远程处理各类安装报错。 一 、edge webview2 runtime跟Edge浏览器软件安装包双击无反应 在安装edge webview2 runtime跟Edge浏览器双击无反应没有出现安装界面。这个可能是 新版本的Edge WebView2 Runti…...
Xorg 内存上涨的根源探究
Xorg 内存上涨的根源探究 起因 在同一客户端进程内显示多股视频源,通过SDL创建窗口渲染,由于网络抖动视频源出现频繁断流现象导致,渲染任务反复重启,从而导致SDL渲染窗口反复创建释放,最后导致Xorg内存持续上涨 排查准备 Xorg是什么? Xorg(X.Org Server)是 X Wind…...
Neo4j基本命令使用
neo4j neo4j简介安装可视化管理后台登录 Cyphercreatematchmergecreate创建关系merge创建关系wheredelete sort命令字符串函数toUpper()函数toLower()函数substring()函数replace()函数 聚合函数count()函数max()函数min()函数sum()函数avg()函数索引index python 中使用neo4j …...
Python爬虫教程009:requests的基本使用以及get和post请求的使用
文章目录 5.1 基本使用5.2 get请求5.3 post请求5.1 基本使用 在 Python 爬虫开发中,requests 是一个非常流行、简单易用的 HTTP 库,用于发送网络请求。它可以让你方便地抓取网页内容、提交表单、上传文件等。 🔧安装: pip install requestsresponse的属性及类型: resp…...
SQL练习
目录 1.查询" 01 "课程比" 02 "课程成绩高的学生的信息及课程分数 2.查询平均成绩大于等于 60 分的同学的学生编号和学生姓名和平均成绩 3.查询在 SC 表存在成绩的学生信息 4.查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩(没成绩的显…...
ubuntu20.04 复现fastlio2 并运行数据包
1.搭建文件目录和拷贝代码 mkdir -p Fastlio2/src cd Fastlio2/src git clone https://github.com/hku-mars/FAST_LIO.git git clone https://github.com/Livox-SDK/livox_ros_driver.git 2.到工作空间下编译 cd .. catkin_make 报错1: 解决方案1: …...
Windows安装 PHP 8 和mysql9,win下使用phpcustom安装php8.4.5和mysql9
百度搜索官网并下载phpcustom,然后启动环境,点击网站管理 里面就有php8最新版,可以点mysql设置切mysql9最新版,如果你用最新版无法使用,说明你的php程序不支持最新版的mysql MySQL 9.0 引入了一些新的 SQL 模式和语法变…...
【失配树 KMP+树上倍增】P5829失配树|省选-
本文涉及知识点 较难理解的字符串查找算法KMP 树上倍增 P5829 【模板】失配树 题目描述 给定一个字符串 s s s,定义它的 k k k 前缀 p r e k \mathit{pre}_k prek 为字符串 s 1 … k s_{1\dots k} s1…k, k k k 后缀 s u f k \mathit{suf}_…...
机器学习模型性能提升教程(特征工程和模型优化)
特征工程和模型优化是提升机器学习模型性能的核心步骤,以下从特征工程和模型优化两个维度,结合具体案例展开说明: 一、特征工程 特征工程的核心目标是从原始数据中提取更有价值的信息,常见方法包括特征选择、特征构造和特征转换。…...
跨域问题前端解决
由于浏览器的同源策略,前后端分离的项目,调试的时候总是会遇到跨域的问题,这里通过修改前端代码解决跨域问题。 首先先查看前端代码的根目录下,有没有vue.config.js文件, 若有,使用方法1,若没有此文件&…...
每天五分钟深度学习框架pytorch:搭建LSTM完成时间序列的预测
本文重点 前面一篇文章我们使用了pytorch搭建了循环神经网络LSTM然后完成了手写字体识别的任务,本文我们使用LSTM完成一个时间序列的任务。 数据集介绍 数据集如图所示,其中有一列是时间,然后还有一列是对应时间的起飞航班数,它可以看成是一个时间序列,通过前面t时间的起…...
Autosar应用层开发基础——Arxml制作
Davinci软件的主要作用 (1) AUTOSAR 软件架构设计 图形化建模:支持 SWC(Software Component)设计、接口定义、端口连接等。 分层架构管理:清晰划分 应用层(SWC) 和 基础软件层(BSW)…...
Word 页眉设置(不同章节不同页眉)
需求分析 要给文档设置页眉,但是要不同的页眉不同的页眉 问题点:一旦设置页眉 每个页眉都是一样的 现在要设置不一样的 设置了页眉但是整个文章的页眉都一样 问题解决 取消链接 前一节(不和前面的页眉同步更新) 小结 不同的…...
Redis的Java客户端的使用
Redis 的 Java 客户端使用 C 追求极致的性能, 而 Java没有这样的追求. Redis 在官网公开了所使用的应用层协议 (RESP). 任何一个第三方都可以通过这个协议, 来实现出一个和 Redis 服务器通信的客户端程序. 已经有很多大佬, 做好了库, 可以让我们直接调用 (不必关注 RESP 协议…...
双向链表示例
#include <stdio.h> #include <stdlib.h>// 定义双向链表节点结构体 typedef struct list {int data; // 数据部分struct list *next; // 指向下一个节点的指针struct list *prev; // 指向前一个节点的指针 } list_t;// 初始化链表,将链表的…...
Unity如何把一个物体下物体复制很多到别的物体下
C# 脚本批量复制 如果需批量复制到多个父物体下,推荐用脚本实现: using UnityEngine;public class CopyChildren : MonoBehaviour {// 原父物体(拖拽赋值)public Transform sourceParent;// 目标父物体数组(可拖拽多个…...