STL:list

list 是什么?

list 本质是:双向链表

std::list<int> l = {1,2,3};

底层结构

nullptr <- [1] <-> [2] <-> [3] -> nullptr

特点:

不连续内存

每个节点单独分配(malloc/new)

list 的核心特性

插入/删除超级快

auto it = l.begin(); l.insert(it, 10); l.erase(it);

时间复杂度:O(1)

原因:
只需要改指针,不用移动数据

不支持随机访问

l[0]; ❌ 不存在

只能:

auto it = l.begin(); ++it;

时间复杂度: O(n)

迭代器稳定

auto it = l.begin(); l.push_back(10); // it 仍然有效 ✅

原因:
 每个节点独立,不会搬家!

list 常用接口

插入

l.push_back(10); l.push_front(5); l.insert(it, 100);

删除

l1.merge(l2);
l.pop_back(); l.pop_front(); l.erase(it); l.remove(10); // 删除所有值为10的

特有操作(vector 没有)

splice(链表拼接)

list<int> l1 = {1,2,3}; list<int> l2 = {4,5}; l1.splice(l1.begin(), l2);

结果:

l1:   4 5 1 2 3
l2:    空

时间复杂度:O(1)

merge(有序链表合并)

l1.merge(l2);

sort(链表排序)

l.sort();

注意:
  std::sort 不能用在 list 上!

为什么 list 很少用?

虽然 O(1) 插入很诱人,但实际:

 缺点很多:

cache 不友好

节点分散,CPU 访问慢

内存浪费

每个节点多两个指针

 malloc 开销大

每次插入都要分配内存

Read more

Redis值数据类型——list

Redis值数据类型——list

4.3 list 4.3.1 概述 1. 存储内容 可存储有序的字符串列表; 1. 常用操作 向列表两端添加元素、获取列表的某一个片段; 1. 底层实现 基于双向链表(double linked list); 1. 性能特性 * 向列表两端添加元素的时间复杂度为 O (1); * 获取元素时,越接近列表两端的元素,访问速度越快; * 极端场景验证:即便列表包含几千万个元素,获取其头部或尾部的 10 条记录仍能达到极快的速度。 4.3.2 命令 1. 向列表两端增加元素 执行 lpush/rpush 时,Redis 会自动创建这个列表,并将元素插入。如果列表存在就会在已有列表上进行操作。向列表(key)的左侧(

By Ne0inhk

2 LangChain 1.0 中间件(Middleware)- wrap_model_call、wrap_tool_call

一、问题理解与目标定义 核心问题:厘清 wrap_model_call 和 wrap_tool_call 两个中间件的职责边界、适用场景及实现差异。 分析目标:帮助开发者在实际项目中准确选择和使用这两个钩子,避免误用,并通过 Python 案例展示其典型应用。 二、中间件功能对比 维度wrap_model_callwrap_tool_call拦截对象大语言模型(LLM)的调用过程Agent 工具(Tool)的执行过程触发时机每次 Agent 调用 LLM 前后(包裹整个调用)每次 Agent 决定调用某个工具时(包裹该工具执行)控制粒度模型输入/输出、模型选择、重试、缓存等工具参数校验、权限控制、审计、重试等典型场景动态模型路由、请求缓存、Token

By Ne0inhk
[LangChain智能体本质论]中间件是如何参与Agent、Model和Tool三者交互的?

[LangChain智能体本质论]中间件是如何参与Agent、Model和Tool三者交互的?

LangChain的中间件(Middleware)是围绕Agent执行流程构建的“可插拔钩子系统”。它允许开发者在不修改核心逻辑的情况下,在执行的关键节点(如输入处理、模型调用前后、输出解析等)对数据流进行拦截、修改或验证。中间件类型以AgentMiddleware为基类。 1. AgentMiddleware AgentMiddleware是一个泛型类型,两个泛型参数分别代表状态和静态上下文的类型,我们可以利用state_schema字段得到状态类型。它的name属性返回中间件的名称,默认返回的是当前的类名。 classAgentMiddleware(Generic[StateT, ContextT]): state_schema:type[StateT]= cast("type[StateT]", _DefaultAgentState) tools: Sequence[BaseTool]@propertydefname(self)->str:return self.__class__.__name__ defbefore_agent(self, state:

By Ne0inhk

C++:initializer_list 与 {} 初始化的本质

目录 前言 用()和 { } 初始化有何不同?  官方文档中关于 {} 初始化的蛛丝马迹 initializer_list set {1,2,3} 到底怎么初始化? set set{other_set} 初始化? _autoclassinit2是个什么玩意? { }初始化真正的作用 {}初始化禁止窄化转换 给读者的最后建议 前言 受限于篇幅和时间,暂时只能说明msvc环境下的初始化列表和__autoclassinit2,linux后续有时间再更新,而且没有说明更多的initializer_list的生命周期等内容。 再次强调本篇环境为MSVC编译器,不同的编译器环境会有差异。 用()和 { } 初始化有何不同?  你在编码的时候肯定会产生这样的疑问,如下面代码所示: #include <iostream> #include <set> int main(void) { std::set&

By Ne0inhk