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

C++ std::list

std::list 是 C++ STL 中基于双向链表实现的序列容器,其设计目标是提供高效的任意位置插入 / 删除操作。

1、底层结构与核心原理

1.1 节点与链表结构

节点组成:每个元素存储在独立的节点中,节点包含三部分

template <typename T>
struct ListNode {T data;          // 元素值ListNode* prev;  // 指向前驱节点ListNode* next;  // 指向后继节点
};

容器内部指针:std::list 维护两个关键指针:

  • head:指向第一个节点(首节点)。
  • tail:指向最后一个节点(尾节点)。

1.2 核心特性

  1. 非连续存储

    • 元素分散在内存的各个地方,不像vectorarray是连续块。
  2. 高效的插入与删除 (O(1))

    • 在任何已知位置(通过迭代器指定)的插入和删除操作都是常数时间复杂度。
    • 操作仅涉及指针的重新赋值,不需要移动任何其他元素。
      • 插入:新分配一个节点,然后调整相邻节点的指针指向这个新节点。
      • 删除:调整目标节点前后节点的指针,让它们彼此指向对方,然后释放目标节点的内存。
  3. 迭代器稳定性

    • 这是list最强大的特性之一。插入操作不会使任何现有的迭代器、指针或引用失效
    • 删除操作只会使指向被删除元素的迭代器、指针或引用失效,其他元素的迭代器仍然完全有效。
    • 这与vectordeque形成鲜明对比,后者在插入/删除时极易导致迭代器大面积失效。
  4. 不支持随机访问 (O(n))

    • 无法使用[]运算符或at()方法直接访问第n个元素。
    • 访问某个特定位置的元素需要从begin()end()开始逐步递增或递减迭代器,时间复杂度为线性O(n)。

2、常用操作与示例代码

2.1 初始化

#include <list>
#include <iostream>// 1. 空list
std::list<int> list1;// 2. 包含 n 个元素,每个元素使用默认值初始化 (int 为 0)
std::list<int> list2(5); // {0, 0, 0, 0, 0}// 3. 包含 n 个元素,每个元素都是 value
std::list<int> list3(5, 100); // {100, 100, 100, 100, 100}// 4. 通过初始化列表 (C++11)
std::list<int> list4 = {1, 2, 3, 4, 5};// 5. 通过迭代器范围(另一个容器的)
std::vector<int> vec = {6, 7, 8};
std::list<int> list5(vec.begin(), vec.end()); // {6, 7, 8}// 6. 拷贝构造函数
std::list<int> list6(list4); // {1, 2, 3, 4, 5}

2.2 元素访问

std::list<int> l = {10, 20, 30};// 访问第一个和最后一个元素
std::cout << l.front(); // 10
std::cout << l.back();  // 30// 错误!list不支持随机访问
// int a = l[1];
// int b = l.at(1);// 正确但低效的方法:使用迭代器步进
auto it = l.begin();
std::advance(it, 1); // 将迭代器 it 前进 1 步,现在指向 20
std::cout << *it;    // 20
// 注意:advance(it, n) 对于list是O(n)操作

2.3 增加元素

std::list<int> l = {1, 2, 3};// 在尾部添加
l.push_back(4);   // {1, 2, 3, 4} - 拷贝或移动
l.emplace_back(5); // {1, 2, 3, 4, 5} - 原地构造,更高效// 在头部添加
l.push_front(0);   // {0, 1, 2, 3, 4, 5}
l.emplace_front(-1); // {-1, 0, 1, 2, 3, 4, 5}// 在指定位置插入
auto it = l.begin();
std::advance(it, 3); // it 现在指向 2
l.insert(it, 99);    // 在 2 之前插入 99 -> {-1, 0, 1, 99, 2, 3, 4, 5}
l.emplace(it, 88);   // 同理,但原地构造 -> {-1, 0, 1, 99, 88, 2, 3, 4, 5}// 插入多个值或一个区间
l.insert(it, 3, 77); // 在 it 前插入 3 个 77
std::vector<int> v = {55, 66};
l.insert(it, v.begin(), v.end()); // 插入一个区间

2.4 删除元素

std::list<int> l = {-1, 0, 1, 77, 77, 77, 55, 66, 88, 2, 3, 4, 5};// 删除头部元素
l.pop_front(); // {0, 1, 77, 77, 77, 55, 66, 88, 2, 3, 4, 5}// 删除尾部元素
l.pop_back(); // {0, 1, 77, 77, 77, 55, 66, 88, 2, 3, 4}// 删除指定位置的元素
auto it = l.begin();
std::advance(it, 3);
it = l.erase(it); // 删除第三个元素(第一个77),erase返回被删除元素的下一个元素的迭代器
// l: {0, 1, 77, 77, 55, 66, 88, 2, 3, 4}// 删除一个区间的元素 [first, last)
auto first = l.begin();
auto last = l.begin();
std::advance(first, 1);
std::advance(last, 4);
l.erase(first, last); // 删除 [第二个元素1, 第五个元素55) 之间的元素(左闭右开)
// l: {0, 55, 66, 88, 2, 3, 4}// 删除所有值等于特定值的元素
l.remove(88); // l: {0, 55, 66, 2, 3, 4}// 删除满足条件的所有元素(例如,删除所有偶数)
l.remove_if([](int n) { return n % 2 == 0; }); // 使用Lambda表达式
// l: {55, 3}// 删除所有元素
l.clear();

2.5 大小与容量操作

std::list<int> l = {1, 2, 3};
std::cout << l.size(); // 3
std::cout << l.empty(); // false (0)l.resize(5); // 将大小增大到5,新增的元素默认初始化为0 -> {1, 2, 3, 0, 0}
l.resize(2); // 将大小减小到2,尾部的元素被丢弃 -> {1, 2}
l.resize(4, 99); // 将大小增大到4,新增的元素初始化为99 -> {1, 2, 99, 99}// list 没有 capacity() 和 reserve() 概念,因为内存是动态按需分配的。

2.6 splice:转移元素的神器

// 将另一个list的元素转移到本list中,不涉及元素的拷贝或移动,只改变指针。
std::list<int> list1 = {1, 2, 3};
std::list<int> list2 = {4, 5, 6};auto it = list1.begin();
std::advance(it, 1); // it 指向 2// 1. 转移整个list2到list1的it位置之前
list1.splice(it, list2);
// list1: {1, 4, 5, 6, 2, 3}
// list2: (空)// 2. 转移另一个list中的单个元素
std::list<int> list3 = {7, 8, 9};
auto it3 = list3.begin(); // it3 指向 7
list1.splice(list1.begin(), list3, it3); // 将list3的it3元素转移到list1开头
// list1: {7, 1, 4, 5, 6, 2, 3}
// list3: {8, 9}// 3. 转移另一个list中的一个元素范围
std::list<int> list4 = {10, 11, 12, 13};
auto first4 = list4.begin(); // 10
auto last4 = first4;
std::advance(last4, 2); // 12
list1.splice(list1.end(), list4, first4, last4); // 转移[10, 11)(左闭右开)
// list1: {7, 1, 4, 5, 6, 2, 3, 10, 11}
// list4: {12, 13}

2.7 sort:成员函数排序

std::list<int> l = {3, 1, 4, 1, 5};
l.sort(); // 默认升序 -> {1, 1, 3, 4, 5}
l.sort(std::greater<int>()); // 传入比较函数,降序 -> {5, 4, 3, 1, 1}
// 使用成员函数sort而不是std::sort,因为它通过修改指针链接而非移动元素来排序,对list更高效。

2.8 merge:合并两个已排序的list

std::list<int> listA = {1, 3, 5};
std::list<int> listB = {2, 4, 6};
listA.merge(listB); // 将listB合并到listA中,两个list都必须已按升序排序。
// listA: {1, 2, 3, 4, 5, 6}
// listB: (空)

2.9 unique:去除连续的重复元素

std::list<int> l = {1, 1, 2, 3, 3, 3, 2, 1};
l.sort(); // 先排序 -> {1, 1, 1, 2, 2, 3, 3, 3}
l.unique(); // 去除连续的重复元素 -> {1, 2, 3}
// 可以传入自定义的二元谓词来判断两个元素是否“重复”

2.10 循环

2.10.1 范围-based for 循环 (C++11+)
#include <iostream>
#include <list>int main() {std::list<int> numbers = {1, 2, 3, 4, 5};// 只读访问for (int num : numbers) {std::cout << num << " ";}// 输出: 1 2 3 4 5// 修改元素for (int& num : numbers) {num *= 2; // 每个元素乘以2}// 再次输出for (int num : numbers) {std::cout << num << " ";}// 输出: 2 4 6 8 10return 0;
}
2.10.2 使用迭代器循环
#include <iostream>
#include <list>int main() {std::list<std::string> fruits = {"Apple", "Banana", "Cherry"};// 正向迭代器for (auto it = fruits.begin(); it != fruits.end(); ++it) {std::cout << *it << " ";}// 输出: Apple Banana Cherry// 常量迭代器for (auto cit = fruits.cbegin(); cit != fruits.cend(); ++cit) {std::cout << *cit << " ";}return 0;
}

3、常见问题

  1. listvector 的区别?各自的适用场景?
  • vector
    • 优点:连续存储,支持快速随机访问(O(1)),缓存友好( locality of reference )。
    • 缺点:在非尾部位置插入删除效率低(O(n)),动态扩容有性能成本。
    • 场景:需要高效随机访问,不经常在中间插入删除,元素数量变化相对可预测。
  • list
    • 优点:在任何位置插入删除都是常数时间(O(1)),操作不会使其他迭代器失效(除了被删除的)。
    • 缺点:不支持随机访问(访问需要O(n)),内存开销大(每个元素都需要额外的指针空间),缓存不友好。
    • 场景:需要频繁在任意位置进行插入删除,且不需要随机访问(如实现链表结构、频繁调整的序列)。
  1. 为什么 list 有自己的 sort 成员函数?
    标准算法std::sort要求随机访问迭代器(因为它需要像begin() + n这样的操作),而list的迭代器是双向迭代器,不支持随机访问。因此,list提供了自己的sort成员函数,它使用归并排序的变体,只通过迭代器的增量和递减来操作,时间复杂度也是O(n log n)

  2. std::list 为什么不支持 operator[]
    因为 std::list 是双向链表,元素存储在非连续内存中,无法通过指针算术直接计算第 n 个元素的地址,必须从表头/表尾遍历(O(n) 时间),不符合 operator[] 预期的 O(1) 效率,因此 STL 设计时未提供该操作。

  3. std::listsize() 方法时间复杂度是 O(1) 吗?

    • C++11 之前:部分实现(如 GCC)中 size() 需遍历链表计数(O(n)),因维护一个 size 成员会增加插入/删除的开销。
    • C++11 之后:标准强制要求 size() 为 O(1),实现中通过一个 size_t 成员变量实时记录元素数量。
  4. std::liststd::forward_list 的区别?

    • std::list 是双向链表,支持双向遍历和首尾操作。
    • std::forward_list 是单向链表(C++11 新增),仅支持正向遍历,内存开销更小(每个节点仅 1 个指针),但功能更有限(无 back()pop_back() 等)。
  5. 如何选择 std::liststd::vector
    核心看操作类型:

    • 若以随机访问尾部操作为主:选 vector
    • 若以任意位置插入/删除为主:选 list
    • 若元素数量固定:优先选 std::arrayvector(空间效率更高)。

相关文章:

C++ std::list

std::list 是 C++ STL 中基于双向链表实现的序列容器,其设计目标是提供高效的任意位置插入 / 删除操作。 1、底层结构与核心原理 1.1 节点与链表结构 节点组成:每个元素存储在独立的节点中,节点包含三部分 template <typename T> struct ListNode {T data; /…...

函数是编程范式的原理是什么?

函数式编程范式(Functional Programming,简称 FP)是一种以函数为核心的编程范式,它将计算视为数学函数的求值,强调纯函数、不可变数据和无副作用,避免使用可变状态和命令式控制流。函数式编程范式(Functional Programming,简称 FP)是一种以函数为核心的编程范式,它将…...

能耐高温400度密封圈用什么材质

在现代工业领域,密封圈是确保各类机械设备、管道系统、阀门等密封性能的关键部件。特别是在高温环境下,密封圈的性能直接关系到整个系统的安全稳定运行。那么,面对高达400度的高温环境,我们应该选择什么样的材质来制作密封圈呢?本文将深入剖析几种耐高温密封圈材料,帮助您…...

【IEEE出版|Fellow云集】第五届电气工程与机电一体化技术国际学术会议(ICEEMT 2025)

会议主要围绕“电气工程”、“机电一体化” 等研究领域展开讨论,旨在为电气工程、机电一体化等领域的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术,了解学术发展趋势,拓宽研究思路,加强学术研究和探讨,促进学术成果产业化合作的平台。第五届电气工…...

APDU笔记

获取IMEI 标准指令获取[2025-09-16 09:31:13.419]# SEND ASCII> AT+CIMI[2025-09-16 09:31:13.473]# RECV ASCII> AT+CIMI460084492003389OK底层APDU指令AT+CSIM=<length>,"<APDU>" <length>:字符数 "<APDU>":以十六进制字…...

AR眼镜:远程协作的“破局者”,让困难解决“云手帮”

AR眼镜:远程协作的“破局者”,让困难解决“云手帮”pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monos…...

跨网文件摆渡系统功能全解析

内容概要 在当今数字化转型的时代,跨网文件摆渡系统成为企业内外网数据交互的关键工具。特别是像Ftrans Ferry跨网文件安全交换系统这样的专业解决方案,备受企业青睐。在选择跨网文件摆渡系统时,了解其核心功能至关重要。本文将详细探讨“跨网文件摆渡系统有哪些功能”,涵盖…...

跨平台代码同步新时代:Gitee携手GitHub打造开发者高效协作生态

跨平台代码同步新时代:Gitee携手GitHub打造开发者高效协作生态 在开源协作日益成为主流的今天,开发者经常面临多平台代码同步的挑战。为解决这一痛点,国内领先的代码托管平台Gitee推出了创新性的仓库镜像管理功能,实现了与全球最大开发者社区GitHub的无缝双向同步能力。这项…...

CTFer

CTFer成长之路 Web入门 传统CTF线上比赛Web 二进制 逆向Web常见漏洞注入 XSS 文件包含 代码执行 上传 SSRF漏洞出现频率 、复杂程度入门 -> 进阶 -> 拓展信息搜集知己知彼,百战不殆 必备工作,重中之重敏感目录泄露 网站源代码、敏感URL地址(后台) 1.Git泄露使用Git过…...

家政小程序源码一站式开发:助力家政企业数字化转型

在当今数字化时代,传统家政行业正经历着深刻的变革。随着生活节奏的加快和居民生活水平的提高,家政服务需求呈现爆发式增长,尤其在一线和二线城市,人们对家政服务的专业性、预约便捷性和服务质量提出了更高要求。基于微信生态的上门预约家政微信小程序,成为连接用户和服务…...

Gitee推出跨平台镜像功能:一键同步GitHub仓库,开发者协作效率提升50%

Gitee推出跨平台镜像功能:一键同步GitHub仓库,开发者协作效率提升50% 在开源生态日益繁荣的今天,开发者经常需要在多个代码托管平台间切换工作。Gitee近日推出的仓库镜像管理功能,为开发者提供了高效的跨平台代码同步解决方案。这项创新功能可实现GitHub与Gitee之间的代码、…...

DeClotH: Decomposable 3D Cloth and Human Body Reconstruction from a Single Image

DeClotH: Decomposable 3D Cloth and Human Body Reconstruction from a Single Image 从单张图像中分解三维布料和人体重建-CVPR2025 观感上一言以蔽之,单张照片重建三维着装人体的基础上分出了服装...

在 Streamable HTTP 传输模式下启动并测试 MCP Serverr (二)

xxx 本文...

从0到1上手阿里云ARMS:让Java服务监控变得简单

从0到1上手阿里云ARMS:让Java服务监控变得简单 作为后端开发,我们常面临“服务出问题却找不到根因”“线上接口耗时突增但无迹可寻”的困境。阿里云应用实时监控服务(ARMS)正是解决这类问题的利器——它能一键接入Java服务,实现调用链追踪、性能监控、异常告警全流程覆盖。…...

聚焦实用:内外网文件摆渡系统品牌推荐来了!

在数字化时代,企业和机构的网络环境日益复杂,为保障数据安全,多数会采用网络隔离措施。但隔离后仍需进行内外网文件交互,由此催生了内外网文件摆渡系统。内外网文件摆渡系统是专为不同安全等级网络(如内网、外网、隔离区)设计的文件传输与交换解决方案,旨在实现数据安全…...

生物活性肽:从基础研究到治疗应用的潜力与挑战,及计算机辅助筛选的关键作用

在生物医药领域的探索进程中,生物活性肽凭借其独特的生物学特性,逐渐成为研究热点。近几十年来,无论是学术科研机构还是工业界的实验室,都对将肽类物质开发为潜在治疗药物表现出日益浓厚的兴趣。 生物活性肽之所以备受关注,核心在于其具备治疗多种疾病的巨大潜力。…...

MySQL视图定义者和安全性definer/invoker的区别

definer和invoker的区别 在创建视图或者是存储过程的时候,是需要定义安全验证方式的(也就是安全性SQL SECURITY),其值可以为definer或invoker,表示在执行过程中,使用谁的权限来执行。 definer:由definer(定义者)指定的用户的权限来执行 invoker:由调用这个视图(存储过程)的…...

软件测试day2

缺陷 定义:软件在使用过程中使用的任何问题都叫软件的缺陷,简称bug 判定标准:少功能 功能错误 多功能 隐形功能错误 不易使用 缺陷产生的原因:需求阶段 设计阶段 编码阶段 运行系统 缺陷的生命周期:测试-故障分类-故障隔离-故障解决(解决了a缺陷可能会有b缺陷) 软件缺陷…...

软件测式学习

认识软件及测式 认识软件:软件是控制计算机硬件工作的工具(系统软件也是软件) 软件的基本组成:页面客户端-代码服务器-数据服务器(请求-处理-响应) 软件产生过程:需求产生-需求文档-设计效果图-产品开发-产品测试-部署上线 什么是软件测试:使用技术手段验证软件是否满足…...

担心安全与速度?这份跨网文件传输方式推荐清单请收好!

在日常工作和业务协同中,跨网文件传输是一个常见却令人头疼的难题。由于受到网络隔离限制,想要做到快速的传输本身就是一个矛盾题,加上做隔离就是为了保护数据安全,要实现安全又快速的跨网文件传输更是难上加难!本文就来说说跨网文件传输时,面临的安全和速度挑战有哪些?…...

kettle基本操作3:剪切原字段末尾的空格符

0.前言 在同步AS400的数据时,原表字段是固定字段长度的,长度不足时使用空格符填充,故直接"表输入"->"表输出"时,目标表也会同步对应的空格符,很明显这是我们所不想要的,以下是通过"字符串操作"处理组件进行处理即可,这里只需要使用一个…...

Guid g = Guid.Empty;Guid.TryParse(, out g);

Guid g = Guid.Empty; 这行代码把变量 g 初始化为 全 0 GUID: 00000000-0000-0000-0000-000000000000 Guid g = Guid.NewGuid(); // 随机 128 位 Guid h = Guid.Empty; // 全 0,固定不变 // 1. 直接给字符串bool ok = Guid.TryParse("3F2504E0-4F89-11D3-9A0C-0…...

【IEEE出版|上海理工大学】第六届大数据、人工智能与物联网工程国际会议(ICBAIE 2025)

会议旨在为从事大数据、人工智能与物联网工程研究的专家学者、工程技术人员、技术研发人员提供一个共享科研成果和前沿技术,了解学术发展趋势,拓宽研究思路,加强学术研究和探讨,促进学术成果产业化合作的平台。第六届大数据、人工智能与物联网工程国际会议(ICBAIE 2025) …...

MDI Jade9.0中文版详细下载及安装教程,附免费免激活版MDI Jade安装包!!

一、MDI Jade9.0软件下载、 [软件名称]:MDI Jade 9.0 下载链接: (建议手机保存后到电脑端打开,下载解压无需任何密码) 夸克网盘链接:https://pan.quark.cn/s/5d0c712833f1 [软件大小]:248M [软件语言]:中文/英文 [安装环境]:Win7或更高,32/64位操作系统 [温馨提示]:我们…...

C++ std::vector

std::vector 是 C++ STL 中最常用的序列容器之一,它提供了动态数组的功能,结合了数组的高效访问和链表的动态扩展能力。 1、底层结构与核心原理 1.1 内存布局连续内存空间:vector 底层是一块连续的动态分配内存,这使得它支持 随机访问(通过下标 [] 或 at() 方法,时间复杂…...

RC-Explainer | Reinforced Causal Explainer for Graph Neural Networks

论文信息论文标题:Reinforced Causal Explainer for Graph Neural Networks论文作者:Xiang Wang, Yingxin Wu, An Zhang, Fuli Feng, Xiangnan He, Tat-Seng Chua论文来源:论文地址:link论文代码:linkAbstract ​  1. 研究核心背景:GNN 可解释性的重要性与现有方法缺陷…...

批量遍历文件夹内得文件生成md5值

#!/bin/sh# 定义输出文件名 output_file="output.txt"# 清空或创建输出文件 : > "$output_file"# 遍历当前目录下的所有文件(不包括子目录) for file in *; do# 跳过目录和特殊文件if [ -f "$file" ]; then# 计算MD5并提取值(兼容文件名中…...

使用源码启动 seata tc server

使用源码启动 seata tc server1.概述 最近在集成seata的时候,由于官方并没有直接的集成文档,因此在使用的时候会有一些问题,问AI有时又不好解决,这个时候通过源码分析问题就很有必要,本文介绍一下如何启动 server server。 2.实现过程 2.1 下载源码 https://seata.apache.…...

OpenLDAP 常见命令行命令及解析

OpenLDAP 常见命令行命令及解析 本文详细介绍了 OpenLDAP 常用的命令行工具及其使用方法,适合 LDAP 管理员和系统运维人员阅读。 目录 基本工具介绍 常用命令详解 实用操作示例 高级功能使用 故障排查技巧 基本工具介绍 OpenLDAP 提供了一系列命令行工具用于目录服务的操作和管…...

自动化http请求脚本

#!/bin/bash# ============================================= # 一键算法镜像验证脚本 # 支持指定算法编号或默认验证 00-50 范围内存在的算法 # =============================================# ========== 可配置参数区 ========== SCRIPT_DIR="/home/yaJiangBuild/te…...

绕过亚马逊儿童版家长控制的技术漏洞分析

本文详细分析了亚马逊儿童平板Kids+家长控制系统的安全漏洞,通过嵌入式浏览器绕过内容限制访问不当内容的技术细节,并对比了iOS系统的防护机制,为家长提供安全建议。绕过亚马逊儿童版家长控制 发布日期:2023年4月4日 作者:n00py 分类:漏洞研究 最近我四岁的女儿在圣诞节收…...

P2564 [SCOI2009] 生日礼物

P2564 [SCOI2009] 生日礼物#include <bits/stdc++.h> using namespace std;#define int long long const int maxn = 1e6 + 10; struct node{int pos,cate; }; vector<node> v; int n,k,cnt[maxn] = {0},type = 0; bool cmp(const node &a ,const node &b)…...

【C++】类与对象(下) - 详解

【C++】类与对象(下) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; font-…...

今日计划-2025年9月16日

新增用例,上库一个MR 调测性能脚本,有个可用的脚本 卷腹+1万步...

C#/.NET/.NET Core技术前沿周刊 | 第 54 期(2025年9.8-9.14)

前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。欢迎投稿、推荐或自荐优质文章、项目、学习资源等…...

C# Avalonia 13- MoreDrawing - GenerateBitmap

C# Avalonia 13- MoreDrawing - GenerateBitmapGenerateBitmap.axaml代码<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008&q…...

Flutter个性化主题系统:Material Design 3的深度定制

Flutter个性化主题系统:Material Design 3的深度定制本文基于BeeCount(蜜蜂记账)项目的实际开发经验,深入探讨如何构建灵活、美观的Material Design 3主题系统。项目背景 BeeCount(蜜蜂记账)是一款开源、简洁、无广告的个人记账应用。所有财务数据完全由用户掌控,支持本地存…...

Typescript中闭包的原理

在 TypeScript(以及 JavaScript)中,闭包描述了函数能够访问其声明时所在作用域的变量,即使该函数在其声明的作用域之外被调用的现象。 定义:闭包是指一个函数能够记住并访问其词法作用域(lexical scope)中的变量,即使这个函数是在其词法作用域之外执行。 闭包的核心原理…...

IvorySQL 4.6:DocumentDB+FerretDB 实现 MongoDB 兼容部署指南

背景 MongoDB 诞生之初,便以出色的易用性与详尽的驱动程序文档脱颖而出,堪称对传统关系型数据库的一次重要革新,也正因如此,它迅速成为开发者社区的热门之选。 然而,随着其许可模式从开源转向 SSPL 许可证,MongoDB 的授权机制变得日趋复杂——这一变化直接导致它不再适配…...

在Xilinx Vitis中创建并使用静态库

1. 创建静态库项目 新建项目: 打开Xilinx Vitis,点击 File → New → Project。 选择 Xilinx → C Project,点击 Next。 输入项目名称(如 MyStaticLib),在 Project Type 中选择 Empty Application。 在 OS Platform 选择 Standalone,点击 Next。 在 Templates 中选择 Em…...

Go使用cyclicbarrier示例

github.com/marusama/cyclicbarrier 是一个 Go 语言库,用于实现 循环屏障(Cyclic Barrier) 的同步机制。它的主要功能是协调多个 goroutine 在某个点等待,直到所有 goroutine 都到达该点后,才能继续执行后续操作。以下是它的核心功能和用途:1. 核心功能同步多个 goroutin…...

做题记录2

CF2144C Non-Descending Arrays 思路 考虑 dp 。 对于每个位置,都有换或者不换两种状态,所以设 \(f_{i, 0/1}\) 为考虑前 \(i\) 个位置,并且第 \(i\) 个位置交换或者不交换累计的收益。接下来枚举每种情况:对于 \(f_{i, 0}\) ,显然可以通过 \(f_{i - 1, 0}\) 直接转移,接下…...

剑指offer-30、连续⼦数组的最⼤和

题⽬描述 输⼊⼀个整型数组,数组⾥有正数也有负数。数组中的⼀个或连续多个整数组成⼀个⼦数组。求所有⼦数组的和的最⼤值。要求时间复杂度为 O(n) . 示例1 输⼊:[1,-2,3,10,-4,7,2,-5] 返回值:18 输⼊的数组为 {1,-2,3,10,-4,7,2,-5} ,和最⼤的⼦数组为 {3,10,-4,7,2} ,…...

ITK-SNAP 安装

ITK-SNAP 安装打开官网 https://www.itksnap.org/pmwiki/pmwiki.php 点击Downloads https://www.itksnap.org/pmwiki/pmwiki.php?n=Downloads.SNAP4 Windows上安装ITK-SNAP 不注册 ITK-SNAP DownloadsITK-SNAP 4.4.0 (LATEST RELEASE) With new AI-based segmentation feat…...

Morpheus 审计报告分享3:StETH 的精度丢失转账机制

漏洞信息 漏洞报告https://code4rena.com/audits/2025-08-morpheus/submissions/S-198漏洞背景https://docs.lido.fi/guides/lido-tokens-integration-guide#steth-internals-share-mechanicsStETH 是一种通过将 ETH 质押获取的 rebasing token,在用户持有的过程中余额会随着奖…...

小区物业的智慧:轻松图解JVM垃圾回收的奥秘

大家好!今天我们来聊聊Java虚拟机(JVM)的垃圾回收(GC)相关的名词解释。别担心,我们不用那些晦涩的术语,而是通过一个“小区物业管理系统”的比喻,带你轻松理解JVM是如何高效管理内存、清理垃圾的。一、引言:物业的烦恼与目标 想象一下,你是一个大型小区的物业经理。你…...

SPI 总线概述及嵌入式 Linux 从属 SPI 设备驱动程序开发(第二部分,实践) - 教程

SPI 总线概述及嵌入式 Linux 从属 SPI 设备驱动程序开发(第二部分,实践) - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…...

详细介绍:idea2025创建第一个项目

详细介绍:idea2025创建第一个项目pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; f…...

CUDA多版本安装切换(转链接自用)

https://www.cnblogs.com/hustmx/p/18097642...

社交交友源码:功能剖析、盈利探索与绿色运营策略

在数字化社交时代,社交交友APP成为人们拓展社交圈、寻找情感连接的重要平台。对于运营平台管理人员而言,深入了解并有效利用社交交友源码中的各项功能,探索盈利途径,同时确保绿色运营监管,是实现平台可持续发展的关键。山东布谷科技将围绕社交交友APP的最新和常用功能展开…...