C++ 迭代器五分类与失效场景汇总:一张表避开所有 UB
std::sort(lst.begin(), lst.end())编译不过for (int x : v) { if (...) v.erase(...); }跑起来会崩 —— 这两个问题的根子是同一件事迭代器不是一种东西而是分等级的而且会在容器改动时失效。这篇文章把「迭代器五分类」和「失效规则」两块拼成一张可查的表以后遇到迭代器相关的报错直接对表。1. 引子sort 为什么拒绝 list给一个std::listint排序最直观的写法是照抄vector的套路// 反例不要这么写list 的迭代器不满足 sort 的要求编译就过不去// std::listint lst{3, 1, 2};// std::sort(lst.begin(), lst.end());线上编译器 gcc 13 会给出「没有匹配的 sort 重载」加一串模板推导失败的注解一句话概括是std::sort的模板参数被约束成「随机访问迭代器」而std::list的迭代器是「双向迭代器」差了一级。list 只能改成// 正确写法list 自带一个成员函数 sort// std::listint lst{3, 1, 2};// lst.sort();这不是标准库在挑刺而是算法和容器之间的一份性能契约std::sort内部是快速排序/内省排序它需要「跳到第 n 个元素」「求两个迭代器的距离」「按下标二分」这些操作只有随机访问迭代器才提供 O(1) 版本。list 的节点散落在堆上it n只能靠一步步走真放进去会退化成 O(n) 的随机访问sort 的复杂度保证当场作废 —— 所以标准干脆在类型层面拒绝它让list::sort用更适合链表的自底向上归并排序来做。官方文档std::sort明确写着要求 LegacyRandomAccessIterator、std::list::sort成员函数版本稳定性有保证2. 五类迭代器能力是层层递进的标准库把迭代器按「能做什么」分成五类iterator category。类别之间是包含关系高类别的迭代器自动满足低类别的一切要求。输入迭代器 前向迭代器 双向迭代器 随机访问迭代器 input iterator forward bidirectional random access ────────────── ──────── ───────────── ────────────── 只能读一次 能多趟遍历 能后退 -- 能 n / -n / it[n] 只能 只能 / -- 能比大小 能 O(1) 求距离 典型来源 典型来源 典型来源 典型来源 istream_iterator forward_list list / map / set vector / deque / array 读文件、读 stdin unordered_map 双向链表 / 红黑树 原生指针 / string 能力包含关系箭头向右能力只增不减 输入 ──► 前向 ──► 双向 ──► 随机访问 输出 ──► 前向 ──► 双向 ──► 随机访问 ← 输出迭代器单独成一条线 记住一句话**算法声明要求哪一类就等于声明它能用哪些操作。** 给 std::sort要求随机访问传双向迭代器 缺了 n 和 编译期就会被挡住。把「能不能做」列成矩阵看得更清楚操作输入输出前向双向随机访问读取*it可以只能读一次不可以可以可以可以写入*it v不可以可以可以元素可写时可以可以it前进可以可以可以可以可以保存it后再走一遍多趟遍历不行不行可以可以可以--it后退不行不行不行可以可以it n/it - n不行不行不行不行可以it[n]随机下标不行不行不行不行可以it1 it2比位置前后不行不行不行不行可以it2 - it1求距离不行不行不行不行可以O(1)代表的操作istream_iteratorback_inserterforward_listlist/mapvector「输入迭代器只能读一次」这条最反直觉std::cin消费的是字符流读过去的字节回不来所以保存一个istream_iterator然后想再走一遍是不成立的。官方文档迭代器库总览 — cppreference、std::iterator_traitsC20 把这一整套重写成了概念conceptstd::input_iterator、std::random_access_iterator等还新增了一档std::contiguous_iterator连续迭代器表示底层元素内存连续vector/array/string属于这一档。分类思想没变只是从「tag 继承」变成了「概念约束」报错信息也因此友好得多。本文按 C17 的 tag 体系讲这是当前工作环境的口径。3. 容器 ↔ 迭代器类别对照容器 / 来源迭代器类别由此带来的限制std::vector/std::array/std::string随机访问能用sort但插入/扩容极易失效std::deque随机访问能用sort插入时几乎全部迭代器失效std::list双向不能用std::sort要用list::sort没有比较std::forward_list前向只能单向走删除要拿到「前一个位置」std::map/std::set/ 多重版本双向不能用std::sort但本身就按 key 有序std::unordered_map/std::unordered_set前向反向遍历和--it都没有rehash 后全失效std::istream_iterator/std::istreambuf_iterator输入单趟读完就没了std::ostream_iterator/std::back_insert_iterator输出只能写不能读也不能比位置原生指针T*随机访问C20 起为连续迭代器数组不够长就是越界 UB这张表有个实用推论「我想反向遍历」这件事在unordered_*上做不到。因为它是前向迭代器没有rbegin()/rend()。要反序输出只能先收集到vector再std::reverse。4. 算法的最低迭代器要求速查标准库算法在文档里都会标注所需的迭代器类别这张表决定了「这个算法能不能用在这个容器上」算法最低要求因此不能用在这些容器上std::find/std::count/std::for_each输入都能用std::copy/std::transform输入 → 输出都能用std::remove_if/std::unique前向都能用std::rotate/std::inplace_merge前向 / 双向forward_list之外基本都能用std::reverse/std::next_permutation双向不能用forward_list和unordered_*std::lower_bound/std::equal_range前向C11 起放宽都能用但无序容器上语义无意义std::sort/std::stable_sort随机访问不能用list/map/set/unordered_*std::partial_sort/std::nth_element随机访问同上std::make_heap/std::push_heap随机访问同上list::sort/forward_list::sort容器内建只在这两个容器上可用官方文档算法库总览 — cppreference每个算法页面都标了 LegacyIterator 要求5. advance / next / distance 与 const_iteratorstd::advance/std::next/std::prev/std::distance是四个「按迭代器类别自动选实现」的工具也是观察类别的窗口。// iterator_utils.cpp — 编译: g -stdc17 -Wall -O2 iterator_utils.cpp -o demo#includecstddef#includecstdio#includeiterator#includelist#includevectorintmain(){conststd::vectorintv{10,20,30,40,50};conststd::listintl{10,20,30,40,50};// distance随机访问迭代器走「直接相减」O(1)其余类别只能一步步 到 O(n)std::printf(vector 距离 %tdO(1)直接相减\n,std::distance(v.begin(),v.end()));std::printf(list 距离 %tdO(n)逐个 \n,std::distance(l.begin(),l.end()));// next / prev返回一个新迭代器不修改入参constautovitstd::next(v.begin(),2);constautolitstd::next(l.begin(),2);std::printf(next(vector::begin, 2) %d\n,*vit);std::printf(next(list::begin, 2) %d\n,*lit);std::printf(prev(next(v.begin, 2)) %d\n,*std::prev(vit));// advance就地移动没有返回值autoaitl.begin();std::advance(ait,3);std::printf(advance(list::begin, 3) %d\n,*ait);// cbegin / cend强制得到 const_iterator从类型上禁止误改元素constautocitv.cbegin();std::printf(cbegin %d\n,*cit);}vector 距离 5O(1)直接相减 list 距离 5O(n)逐个 next(vector::begin, 2) 30 next(list::begin, 2) 30 prev(next(v.begin, 2)) 20 advance(list::begin, 3) 40 cbegin 10两个实用结论别在循环里对非随机访问容器调std::distance。每次调用是 O(n)套在循环里就变成 O(n²)。对list求长度用l.size()C11 起是 O(1)。cbegin()/cend()是「只读」的编译期保证begin()在const对象上才返回const_iterator。函数参数故意写成const auto或者显式用cbegin()能让「本意只读」这件事被编译器守住。官方文档std::distance、std::advance、std::next6. 迭代器失效大表全篇最该收藏的一节「迭代器失效iterator invalidation」指的是容器做了某个操作后之前拿到的迭代器不能再用了继续解引用或自增就是未定义行为undefined behaviorUB。标准对每个容器的每种操作都有明确规定汇总如下。容器insert/emplaceerase(it)push_back/pop_back重分配 / rehashclear()vector未超capacity→ 插入点之后的失效超了 →全部失效被删元素及其之后的全部失效push_back同上可能扩容pop_back只让被删元素失效reserve/ 扩容 →全部失效全部失效deque全部迭代器失效但指向元素的引用/指针仍有效全部失效元素本身还在的仍可引用push_front/push_back→全部失效pop_*只让被删元素失效不适用全部失效list只有end()失效只有被删元素失效只有end()失效不适用全部失效forward_list只有end()/before_begin()失效只有被删元素失效push_front不影响其他迭代器不适用全部失效map/set/ 多重版本全部保持有效只有被删元素失效不适用不适用全部失效unordered_map/unordered_set未 rehash → 保持有效rehash → 全部失效只有被删元素失效不适用rehash → 迭代器全失效但指向元素的指针/引用仍有效全部失效string同vectorSSO 短字符串时引用也可能失效同vector同vector同vector全部失效array不适用定长不适用不适用不适用不适用三个最容易记混的点拎出来单独说vector的「部分失效」有条件。只有capacity够、不发生重新分配时才是「插入点之后的失效」一旦扩容整块缓冲区搬家所有迭代器、指针、引用全废。第 7 节会把这个搬家过程画出来。deque是「迭代器比引用脆」的典型。push_front/push_back会让所有迭代器失效但已经存在的元素不会搬家所以指向元素的引用和指针仍然有效。这个区别在有外部缓存引用时很关键。list/map/set是「节点式容器」失效面最小。插入不搬任何已有节点所以除end()外全部迭代器保持有效删除也只影响被删的那个。想让「指向元素的指针/引用长期稳定」就得选节点式容器。另外C11 起insert和erase都有返回值这一点是修正失效问题的基础erase(it)返回被删元素之后的下一个有效迭代器。insert(...)返回指向新插入元素的迭代器。官方文档容器库 —— 迭代器失效规则汇总、std::vector 的失效说明、std::unordered_map 的失效说明7. vector 扩容迭代器失效的物理原因前面反复提到「扩容导致全部失效」跑一遍把这个过程看看清楚① v.reserve(2) 后 push_back 两个元素capacity 用满 v 的控制块 {begin, end, cap_end} │ ▼ ┌─────┬─────┐ │ 1 │ 2 │ 堆上的缓冲区capacity 2 └─────┴─────┘ ▲ │ 某个迭代器 it 也指向这里 ② v.push_back(3) —— capacity 不够必须「另开一块更大的 把元素搬过去 释放旧的」 新缓冲区capacity 4 ┌─────┬─────┬─────┬─────┐ │ 1 │ 2 │ 3 │ — │ └─────┴─────┴─────┴─────┘ ▲ │ v.begin() 现在指这里 ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ │ 1 │ 2 │ 旧缓冲区已释放 └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ ▲ │ it 还指向这块已经失效的内存 → 悬垂迭代器dangling iterator 再用它解引用或 就是 UB// vector_realloc.cpp — 编译: g -stdc17 -Wall -O2 vector_realloc.cpp -o demo#includecstdio#includevectorintmain(){std::vectorintv;v.reserve(2);// 预分配 2 个位置v.push_back(1);v.push_back(2);constint*buffer_beforev.data();// 记录缓冲区首地址只用来比较「有没有搬家」std::printf(填满 capacity 后: size%zu capacity%zu\n,v.size(),v.capacity());v.push_back(3);// 超出 capacity → 重新分配 搬迁std::printf(再插一个之后 : size%zu capacity%zu\n,v.size(),v.capacity());std::printf(缓冲区搬家了吗: %s\n,v.data()buffer_before?没有迭代器仍有效:搬了旧迭代器全部失效);}填满 capacity 后: size2 capacity2 再插一个之后 : size3 capacity4 缓冲区搬家了吗: 搬了旧迭代器全部失效所以「提前reserve(n)」不只是性能优化少几次分配和拷贝它还是避免迭代器失效的手段 —— 容量一次给够后面就不会因为扩容而整块搬家。这也是为什么《vector 扩容策略与迭代器失效全解》里反复强调「知道元素数量就reserve」。官方文档std::vector::reserve、C Core Guidelines — SL.con.2 默认选 vector8. 遍历中删除元素两种必崩的写法这是迭代器失效在真实代码里最高频的翻车现场。// 反例 1不要这么写erase 后 it 已经失效下一轮 it 是 UB// for (auto it v.begin(); it ! v.end(); it) {// if (*it % 2 0) {// v.erase(it); // it 失效紧接着 for 的自增 it 踩在失效迭代器上// }// }// 反例 2不要这么写范围 for 的隐藏迭代器改不了删元素必然踩空// for (int x : v) {// if (x % 2 0) {// v.erase(v.begin()); // 隐藏迭代器不知道这回事下一次自增就是 UB// }// }范围 for 会被展开成auto __range v; auto __it begin(__range); ... __it其中__it是编译器的隐藏变量你拿不到也改不了。既然没法把它更新成erase的返回值范围 for 里就不能删元素 —— 这是硬结论不是风格问题。正确写法只有一个模式手动写循环、把erase的返回值接回来。// erase_pattern.cpp — 编译: g -stdc17 -Wall -O2 erase_pattern.cpp -o demo#includecstdio#includeiterator#includelist#includemap#includevectorintmain(){// ① vectorerase 返回下一个有效迭代器必须用它续上std::vectorintv{1,2,3,4,5,6};for(autoitv.begin();it!v.end();){if(*it%20){itv.erase(it);// 关键用返回值续上不要 it}else{it;// 不删才前进}}std::printf(vector 删偶数后: );for(intx:v){std::printf(%d ,x);}std::printf(\n);// ② map同一个模式而且 erase 只让被删元素失效其他迭代器不受影响std::mapint,intm{{1,10},{2,20},{3,30},{4,40}};for(autoitm.begin();it!m.end();){if(it-first%20){itm.erase(it);}else{it;}}std::printf(map 删偶数 key 后大小 %zu\n,m.size());// ③ list还是同一个模式list 是双向迭代器没有 n用 std::next 前进std::listintlst{1,2,3,4,5,6};for(autoitlst.begin();it!lst.end();){if(*it%20){itlst.erase(it);}else{itstd::next(it);}}std::printf(list 删偶数后大小 %zu\n,lst.size());}vector 删偶数后: 1 3 5 map 删偶数 key 后大小 2 list 删偶数后大小 3模式只有三行记住它的形状就行for (auto it c.begin(); it ! c.end(); ) ← 注意 for 的第三格是空的 { if (要删的条件) it c.erase(it); ← 接住返回值迭代器自己前进 else it; ← 不删才手动前进 } 口诀**删了就接返回值没删就手动 绝不同时做两件事。**C20 还给了更省事的写法std::erase_if(container, pred)一行搞定内部就是上面这个循环。// verify: stdc20// 需要 C20std::erase_if 统一了「按条件删除」的写法// std::erase_if(v, [](int x) { return x % 2 0; });// std::erase_if(m, [](const auto kv) { return kv.first % 2 0; });9. 完整示例靠迭代器类别做编译期分派最后把「类别」这件事用起来。标准库自己就是这么干的std::distance内部按类别分派我们也能用std::iterator_traitsif constexpr写一个「随机访问就 O(1) 求长度否则老老实实数」的版本// category_dispatch.cpp — 编译: g -stdc17 -Wall -O2 category_dispatch.cpp -o demo#includecstddef#includecstdio#includeforward_list#includeiterator#includelist#includemap#includetype_traits#includevectornamespace{// 按迭代器类别在编译期选实现随机访问直接相减其余类别逐个 templatetypenameItstd::size_tcountElems(It first,It last){usingCategorytypenamestd::iterator_traitsIt::iterator_category;ifconstexpr(std::is_base_of_vstd::random_access_iterator_tag,Category){returnstatic_caststd::size_t(last-first);// O(1)}else{std::size_t n0;for(;first!last;first){// O(n)n;}returnn;}}}// namespaceintmain(){conststd::vectorintv{1,2,3,4,5};conststd::listintl{1,2,3};conststd::forward_listintf{1,2,3,4};conststd::mapint,intm{{1,10},{2,20}};std::printf(vector 个数 %zu随机访问O(1) 相减\n,countElems(v.begin(),v.end()));std::printf(list 个数 %zu双向O(n) 逐走\n,countElems(l.begin(),l.end()));std::printf(forward_list 个数 %zu前向O(n) 逐走\n,countElems(f.begin(),f.end()));std::printf(map 个数 %zu双向O(n) 逐走\n,countElems(m.begin(),m.end()));}vector 个数 5随机访问O(1) 相减 list 个数 3双向O(n) 逐走 forward_list 个数 4前向O(n) 逐走 map 个数 2双向O(n) 逐走这段代码正好收束了全篇的主线std::iterator_traitsIt::iterator_category是「问编译器这个迭代器属于哪一类」的标准入口。if constexprC17让分支在编译期就被丢弃——last - first这段代码对list根本不会被实例化所以即使双向迭代器没有operator-编译也不会报错。这是泛型代码里处理「能力差异」的标准手法。std::is_base_of_v之所以能用来判断类别正因为五类迭代器的 tag 之间是继承关系random_access_iterator_tag继承自bidirectional_iterator_tag一路到input_iterator_tag这也是第 2 节那张包含关系图的类型层面体现。官方文档std::iterator_traits、std::random_access_iterator_tag、if constexprC1710. 延伸阅读迭代器库 — cppreference五类 tag、iterator_traits、工具函数的总入口最该先读的一页容器库 — cppreference每个容器页面下方的「Iterator invalidation」小节是失效规则的唯一权威来源本文那张大表就是从这儿逐条抄下来的算法库 — cppreference每个算法都标了最低迭代器要求看一眼就知道能不能用在list上std::vector — cppreference重点关注 capacity 与 reallocation 的说明理解它才能理解失效C Core Guidelines — SL.con.2默认用vector需要稳定引用/迭代器时再换节点的选型思路11. 一句话总结迭代器的类别决定了「能对容器做什么」容器的失效规则决定了「拿到手的迭代器还能活多久」——算法挑类别sort要随机访问list不满足、代码避失效vector扩容全废、节点容器最稳、遍历中删除一律走「it c.erase(it)或it二选一」这一个模式。三件事记牢迭代器相关的 UB 基本就绝迹了。

相关新闻

上网第十六课:家里 20 台设备一联网就卡?WiFi6 两大必杀技 OFDMA、MU-MIMO 一次讲透

上网第十六课:家里 20 台设备一联网就卡?WiFi6 两大必杀技 OFDMA、MU-MIMO 一次讲透

装维上门常碰到一个怪现象:用户刚把宽带升到千兆,一到晚上七八点全家联网,还是卡成 PPT。查后台——路由器是五年前的老款。换上一台 WiFi6 路由器,同一帮设备、同一根宽带,居然就不卡了。套餐没变、网线没动&#xff…

2026/10/3 17:41:12 阅读更多 →
@电气自动化人,2026年湖北省厅电子信息、计算机、自动化、电气职称申报开始

@电气自动化人,2026年湖北省厅电子信息、计算机、自动化、电气职称申报开始

一、2026年湖北省厅电子信息、计算机、自动化、电气职称申报专业类目:✅电子信息:电子科学与技术、光电子技术与工程、电子元器件、电子材料、电子技术与工程、信息工程与量子通信、量子测量、医学信息工程、视听技术、电子仪器仪表、家电产品、电子装备…

2026/10/3 17:41:12 阅读更多 →
9.24 面试复盘

9.24 面试复盘

1.关于atomic和mutex的区别 2.项目描述 3.自我介绍 您好,我本科专业是环境科学,但因为自己比较喜欢编程,所以从大学期间开始系统学习 C。目前主要掌握 C、数据结构、Linux、多线程以及 Qt 开发。C方面学习过面向对象、STL、内存管理等基础知…

2026/10/3 17:41:12 阅读更多 →

最新新闻

游戏逆向工程与反作弊攻防:从内存分析到协议逆向的技术全景

游戏逆向工程与反作弊攻防:从内存分析到协议逆向的技术全景

1. 游戏逆向工程到底在做什么 很多人第一次听到“游戏逆向工程”这个词,脑子里浮现的画面要么是外挂作者在破解游戏,要么是黑客在搞破坏。实际上,这个领域远比想象中复杂,也远比想象中正经。我在这行摸爬滚打十来年,接…

2026/10/3 18:52:41 阅读更多 →
免Root静默授权安卓远程控制:Shizuku+App Ops实战方案

免Root静默授权安卓远程控制:Shizuku+App Ops实战方案

1. 项目概述:为什么“远程控制弹窗”成了安卓生态里最顽固的牛皮癣? 你有没有过这样的经历:刚点开向日葵、TeamViewer或某款企业级远程协作App,屏幕中央立刻弹出一个半透明灰底白字的授权框——“允许XXX访问您的设备?…

2026/10/3 18:52:41 阅读更多 →
片元着色器入门:从零理解GPU逐像素着色原理与WebGL实战

片元着色器入门:从零理解GPU逐像素着色原理与WebGL实战

这一篇我们聊片元着色器(Fragment Shader)。前面几篇把渲染管线和顶点着色器过了一遍之后,很多零基础读者真正卡住的地方就出现在这里:顶点着色器好歹还能和“坐标”“模型”联系起来,片元着色器一上来就面对一堆颜色、…

2026/10/3 18:52:41 阅读更多 →
OpenShell实战:跨平台终端会话管理与效率增强工具全解析

OpenShell实战:跨平台终端会话管理与效率增强工具全解析

1. 项目概述与核心价值 1.1 OpenShell 到底是什么 第一次听到"OpenShell"这个名字,很多人会下意识以为是某个操作系统的开源替代品,或者是某种远程连接工具。其实都不完全是。OpenShell 是一个面向命令行重度用户的 跨平台终端效率增强工具集…

2026/10/3 18:52:40 阅读更多 →
昇思MindSpore中max_lr调优实战:从NaN到收敛

昇思MindSpore中max_lr调优实战:从NaN到收敛

前几天帮一位师弟调试CIFAR-10图像分类的小网络,他跑了一个晚上,loss曲线像坐了过山车:前面几个epoch还在正常下降,到第五个epoch左右直接飙成NaN。我盯着训练日志看了很久,排除掉数据、归一化、模型结构一堆嫌疑之后&…

2026/10/3 18:52:39 阅读更多 →
Jev本地模型接入Codex:用TypeSafe决策模型实现离线与云端的自动路由

Jev本地模型接入Codex:用TypeSafe决策模型实现离线与云端的自动路由

1. 先把 Jev、Codex、TypeSafe 这三个词放在同一张桌上 1.1 Jev 到底是个什么东西,它为什么值得接进 Codex 先交代背景。我最近一直在用 Codex 做终端里的编码代理,它能把“你帮我改一下这个模块”这种自然语言指令,拆解成改文件、跑测试、查…

2026/10/3 18:51:38 阅读更多 →

日新闻

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南

把回忆蒸馏成 AI 的浪漫实验:为什么你需要前任.skill 完整指南 【免费下载链接】ex-skill 前任 skill 项目地址: https://gitcode.com/gh_mirrors/exsk/ex-skill 前任.skill 是一个运行在 Claude Code 上的开源 Skill:导入微信、iMessage、短信、…

2026/10/3 0:00:27 阅读更多 →
45个经典Linux面试题:从命令到网络排障的完整考点解析

45个经典Linux面试题:从命令到网络排障的完整考点解析

刚开始带应届生的时候,我最头疼的就是他们拿着一摞Linux面试题背得滚瓜烂熟,一上机全露馅。后来自己从被面的人变成面别人的人,才慢慢摸清楚:Linux面试题考的根本不是答案本身,而是你面对一个不确定的系统问题时&#…

2026/10/3 0:01:28 阅读更多 →
SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

SAP生产预留实战指南:MB21/MB23/MB25协同与MRP集成

简介:本资源是一份面向SAP ABAP开发人员、生产计划专员及ERP实施顾问的实操型操作指南,聚焦SAP生产预留核心业务场景,系统解决物料预留创建、查询、校验与批量处理等高频问题。文档以结构化方式覆盖预留背景原理、OMC2编码规则、工厂级参数配…

2026/10/3 0:01:28 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/10/3 9:14:33 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/10/3 9:47:50 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/10/3 9:42:31 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/2 10:36:31 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:35 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/3 9:42:36 阅读更多 →