C++ STL中std::greater<T>实现降序排序的原理与实践
1. 项目概述从大到小排序的“幕后推手”在C的日常开发里给一组数据排序是再常见不过的需求。我们经常用std::sort默认情况下它会把数据从小到大排好省心省力。但有时候需求就是反着来的比如展示排行榜要成绩从高到低或者处理某些需要逆序优先级的任务。这时候新手可能会自己写一个比较函数或者Lambda表达式但对于老手来说更优雅、更“STL”的做法是直接请出一个预定义的“帮手”——std::greaterT。这个看似简单的函数对象其实是STL算法库设计哲学的一个缩影提供通用、高效且易于组合的组件。今天我们就来深入聊聊如何用std::greaterT配合std::sort轻松实现容器元素的从大到小排序并借此窥探STL算法与函数对象协同工作的精妙之处。无论你是正在巩固STL基础的初学者还是想写出更地道C代码的进阶者这个把“反向排序”标准化、简单化的技巧都值得你放进工具箱。2. 核心思路解析为什么是greaterT而不是自定义函数当我们想让sort反向排序时脑子里第一反应可能是写个这样的Lambda[](int a, int b){ return a b; }。这当然没问题也能跑。但std::greaterT的存在给了我们一个更优的选择。这背后的考量远不止少写几行代码那么简单。2.1 预定义函数对象的本质与优势STL在functional头文件中预定义了一组函数对象也叫函数符Functorsstd::greaterT就是其中之一。它们本质上是实现了operator()的类或结构体对象。对于greaterT它的operator()做的就是比较两个参数返回a b的结果。为什么推荐使用它而非临时Lambda意图清晰自文档化代码sort(vec.begin(), vec.end(), greaterint())一眼就能看出是“按大于关系排序”即降序。而一个自定义的Lambda需要阅读其函数体才能理解意图。在团队协作或维护旧代码时这种清晰性至关重要。标准化与可靠性std::greater是标准库的一部分它的行为是严格定义且经过充分测试的。你不需要担心边界条件处理出错比如忘了处理相等情况标准库保证其正确性。潜在的优化空间编译器对于标准库中这些众所周知的函数对象可能有特殊的识别和优化。虽然对于简单的整数比较Lambda也可能被内联优化得一样好但在更复杂的场景或某些编译器优化策略下使用标准函数对象可能带来微小的性能优势或更稳定的生成代码。与其它组件的无缝结合STL中的很多算法和容器适配器如priority_queue天然接受这些标准函数对象作为参数。使用greaterT可以让你在不同STL组件间保持一致的排序逻辑减少适配成本。例如一个最大堆priority_queueT, vectorT, greaterT使用的比较器和你想对向量进行降序排序时使用的比较器可以是同一个greaterT概念上非常统一。2.2sort算法与比较器的协作机制std::sort是一种基于比较的排序算法通常是内省排序一种混合了快速排序、堆排序和插入排序的算法。它的核心在于通过用户提供的“比较器”Comparator来定义元素间的顺序关系。比较器必须满足严格弱序Strict Weak Ordering的要求。简单来说它需要像一个“小于”函数如果a应排在b之前则comp(a, b)返回true。反对称性如果comp(a, b)为true则comp(b, a)必须为false。传递性如果comp(a, b)为true且comp(b, c)为true则comp(a, c)必须为true。std::sort默认使用std::lessT()作为比较器它定义“小于”关系因此得到升序。当我们传入std::greaterT()算法内部就会使用“大于”关系来决定元素的前后顺序从而自然得到降序结果。算法本身并不关心是“小于”还是“大于”它只忠实于你提供的比较规则。注意这里有一个初学者极易混淆的点。sort的第三个参数是一个“比较谓词”它应该模拟“小于”的行为。当我们传入greater时greater(a, b)在a b时返回true。这意味着在排序过程中当a b为真时a会被排在b的前面。这正是我们想要的降序效果。不要把它理解成“按大于规则从大到小排”而是“当a大于b时a排在b前面”这样思考更符合算法语义。3. 实战演练多种容器与数据类型的降序排序理解了原理我们来看具体怎么用。std::greaterT的使用非常直接但针对不同的容器和数据类型有一些细节需要注意。3.1 基础示例对vectorint进行降序排序这是最经典的场景。假设我们有一个存储整数的向量。#include iostream #include vector #include algorithm // for std::sort #include functional // for std::greater int main() { std::vectorint numbers {3, 1, 4, 1, 5, 9, 2, 6, 5}; // 默认升序排序 // std::sort(numbers.begin(), numbers.end()); // 使用 std::greaterint() 进行降序排序 std::sort(numbers.begin(), numbers.end(), std::greaterint()); // 输出结果 for (int num : numbers) { std::cout num ; } // 输出: 9 6 5 5 4 3 2 1 1 std::cout std::endl; return 0; }关键点解析std::greaterint()这里我们创建了一个std::greaterint类型的临时匿名对象右值。sort函数接受这个对象作为比较器。int指定了这个函数对象用于比较int类型。头文件functional必须包含它定义了std::greater。作用范围sort要求随机访问迭代器所以它适用于vector、deque、普通数组和string但不适用于list或forward_list它们有各自的sort成员函数。3.2 扩展至其他数据类型和容器1. 对vectordouble或vectorstring排序只需将模板参数T替换为对应的类型即可。STL的模板机制会自动适配。std::vectordouble prices {19.99, 5.49, 24.99, 10.0}; std::sort(prices.begin(), prices.end(), std::greaterdouble()); // prices 变为 {24.99, 19.99, 10.0, 5.49} std::vectorstd::string words {apple, banana, cherry, date}; std::sort(words.begin(), words.end(), std::greaterstd::string()); // words 变为 {date, cherry, banana, apple} (按字典序降序)2. 对自定义结构体或类排序这是更常见也更有价值的场景。假设我们有一个Person类想按年龄降序排列。#include algorithm #include vector #include functional #include string struct Person { std::string name; int age; }; int main() { std::vectorPerson people {{Alice, 30}, {Bob, 25}, {Charlie, 35}}; // 方法一使用 Lambda 表达式 // std::sort(people.begin(), people.end(), // [](const Person a, const Person b) { return a.age b.age; }); // 方法二使用 std::greater 配合自定义比较器需要先定义排序规则 // 但 std::greater 默认不知道如何比较 Person 对象。 // 我们需要提供一个能比较 Person 的函数对象或者特化 std::greater。 // 更推荐的做法定义一个专用的函数对象或使用Lambda。 // 如果非要用 greater 的风格可以这样 struct CompareByAgeDesc { bool operator()(const Person a, const Person b) const { return a.age b.age; // 注意这里是 模拟 greater 的行为 } }; std::sort(people.begin(), people.end(), CompareByAgeDesc()); for (const auto p : people) { std::cout p.name : p.age std::endl; } // 输出: // Charlie: 35 // Alice: 30 // Bob: 25 return 0; }实操心得对于自定义类型直接使用std::greaterYourType通常行不通除非你为该类型重载了operator或者特化了std::greater模板。在工程实践中为自定义类型重载operator用于默认升序是常见做法同时配合std::greater来实现降序会更方便。或者直接使用Lambda表达式往往是最灵活、最清晰的选择尤其是当排序规则可能变化或比较复杂时。不要为了使用greater而强行使用代码的清晰度和可维护性永远是第一位的。3. 对数组排序std::sort同样适用于原生数组只需传递指针作为迭代器。int arr[] {5, 2, 8, 1, 9}; int size sizeof(arr) / sizeof(arr[0]); std::sort(arr, arr size, std::greaterint()); // arr 变为 {9, 8, 5, 2, 1}4. 对deque和string排序用法与vector完全一致因为它们都提供随机访问迭代器。std::dequeint dq {4, 2, 7, 1}; std::sort(dq.begin(), dq.end(), std::greaterint()); std::string str hello; std::sort(str.begin(), str.end(), std::greaterchar()); // str 变为 ollhe (字符按ASCII码降序)4. 性能考量与进阶用法4.1greaterT的性能开销很多人会担心使用函数对象会不会带来额外的开销。实际上在优化良好的编译器中如GCC、Clang、MSVC开启优化后像std::greaterint这样简单的函数对象其operator()调用会被完全内联Inline。最终生成的机器码与直接使用a b这个表达式几乎没有区别。因此在性能上你可以放心使用它不会比手写比较代码慢。我们可以通过一个简单的测试来验证尽管微基准测试需要谨慎对待#include algorithm #include vector #include functional #include chrono #include iostream #include random int main() { const size_t size 1000000; std::vectorint data(size); std::mt19937 rng(std::random_device{}()); std::uniform_int_distributionint dist(1, 1000000); for (auto num : data) num dist(rng); auto data1 data; // 拷贝一份 auto data2 data; // 拷贝另一份 // 测试使用 std::greater auto start1 std::chrono::high_resolution_clock::now(); std::sort(data1.begin(), data1.end(), std::greaterint()); auto end1 std::chrono::high_resolution_clock::now(); auto duration1 std::chrono::duration_caststd::chrono::microseconds(end1 - start1); // 测试使用 Lambda 表达式 auto start2 std::chrono::high_resolution_clock::now(); std::sort(data2.begin(), data2.end(), [](int a, int b) { return a b; }); auto end2 std::chrono::high_resolution_clock::now(); auto duration2 std::chrono::duration_caststd::chrono::microseconds(end2 - start2); std::cout Time with std::greater: duration1.count() us\n; std::cout Time with lambda: duration2.count() us\n; // 两者时间通常非常接近差异在误差范围内。 return 0; }4.2 与其它STL组件的联用std::greater的用武之地不只在sort。它在定义特定数据结构的排序规则时非常有用。1. 定义最小堆Min-Heapstd::priority_queue默认是最大堆使用std::lessT队首最大。如果想得到最小堆队首最小就需要传入std::greaterT作为比较器。#include queue #include functional std::priority_queueint, std::vectorint, std::greaterint minHeap; minHeap.push(5); minHeap.push(1); minHeap.push(8); std::cout minHeap.top(); // 输出 1 (最小的元素在队首)2. 让关联容器按降序存储std::set,std::map,std::multiset,std::multimap的模板参数也接受一个比较器类型。默认是std::lessKey导致元素按键升序排列。我们可以通过传入std::greaterKey来让其按降序排列。#include set #include functional // 一个按降序存储整数的集合 std::setint, std::greaterint descendingSet {3, 1, 4, 1, 5}; for (int num : descendingSet) { std::cout num ; // 输出: 5 4 3 1 }3. 在算法中作为二元谓词任何接受二元谓词Binary Predicate的STL算法都可以使用std::greater例如std::nth_element,std::partial_sort,std::make_heap等。std::vectorint vec {9, 3, 6, 2, 8, 5}; // 将前3大的元素放到序列前面顺序不定 std::partial_sort(vec.begin(), vec.begin() 3, vec.end(), std::greaterint()); // vec 可能变为 {9, 8, 6, 2, 3, 5}前三个是最大的。4.3 自定义函数对象与greater的对比当比较逻辑稍微复杂一点时我们就需要在“自定义函数对象”和“Lambda表达式”之间做选择。std::greater可以看作是一个极其简单的、标准化的自定义函数对象。std::greaterT适用于简单的、标准的降序比较。意图明确零开销。Lambda表达式适用于临时的、一次性的复杂比较逻辑。写法紧凑能捕获外部变量非常灵活。例如按结构体的某个成员降序排序用Lambda最方便sort(people.begin(), people.end(), [](const Person a, const Person b) { return a.score b.score; });自定义函数对象类如CompareByAgeDesc适用于重复使用的、逻辑固定的复杂比较。它是有名字的类型可以清晰表达意图也可以作为模板参数传递比如给set或priority_queue。如果同一个比较规则在代码中多处使用定义成一个函数对象类是更好的选择避免了Lambda的重复定义。5. 常见陷阱、调试技巧与最佳实践即使是一个简单的排序也可能藏着一些坑。下面是一些实战中总结出来的经验和需要注意的地方。5.1 易犯错误与排查清单问题现象可能原因解决方案编译错误no matching function for call to ‘sort(...)’1. 未包含algorithm头文件。2. 迭代器类型不匹配如对list使用std::sort。3. 比较器签名错误返回值不是bool或参数类型不匹配。1. 确保#include algorithm。2.std::sort需要随机访问迭代器。对list使用list::sort()成员函数。3. 检查比较器是否形如bool comp(const T a, const T b)。排序结果不正确非预期顺序1. 比较器逻辑写反。例如想降序却写了return a b;。2. 比较器不满足严格弱序例如在处理浮点数时直接使用或!判断相等或比较函数有副作用。3. 容器内元素在排序过程中被意外修改多线程问题。1. 牢记如果comp(a, b)为true则a会排在b前面。降序就是a b。2. 确保比较器是“纯函数”且具有反对称性和传递性。浮点数比较建议使用容差。3. 确保排序区间数据稳定。运行时错误如访问越界传递的迭代器范围无效例如begin在end之后或者迭代器来自不同的容器。仔细检查sort调用的两个迭代器参数是否指向同一个容器的有效范围。自定义类型使用greaterMyType编译失败编译器不知道如何比较你的类型。std::greater默认使用operator进行比较。1. 为你的类型重载operator运算符。2. 或者不使用greater改用自定义比较器Lambda或函数对象。关于浮点数的特别提醒 直接使用greaterdouble对浮点数向量排序在大多数情况下没问题但如果你需要处理可能包含NaN非数字或者对精度有极端要求的情况需要小心。NaN与任何值包括它自己的比较结果都是false这破坏了严格弱序可能导致未定义行为如程序崩溃。在科学计算等场景排序前可能需要过滤或特殊处理NaN。5.2 调试技巧如何验证排序逻辑打印中间状态对于小型容器可以在自定义比较器或Lambda中加入打印语句但注意比较器不应有副作用调试完务必移除。std::sort(vec.begin(), vec.end(), [](int a, int b){ bool result a b; std::cout Comparing a and b - result std::endl; return result; });这能帮你直观看到算法调用了多少次比较以及每次比较的参数和结果。但注意sort是高度优化的比较次数和顺序可能与教科书上的算法不同。使用std::is_sorted检查排序完成后可以使用std::is_sorted配合相同的比较器来验证结果。if (std::is_sorted(vec.begin(), vec.end(), std::greaterint())) { std::cout The vector is correctly sorted in descending order.\n; } else { std::cout Sorting failed!\n; }单元测试对于关键的排序逻辑尤其是自定义比较器编写单元测试是保证正确性的最佳实践。测试用例应包含边界情况如空容器、单元素容器、所有元素相等、已排序序列、逆序序列等。5.3 最佳实践总结优先使用标准组件像std::greater这样的预定义函数对象在满足需求时应优先使用。它们使代码更简洁、更标准、意图更清晰。理解比较语义始终记住传递给sort的比较器决定了“前”与“后”的关系。comp(a,b)true意味着a应该出现在b的前面。用这个原则去推导升降序。自定义类型的排序为自定义类型定义排序规则时考虑重载operator以实现默认的升序排序。降序则可以通过std::greater或反向迭代器 (sort(vec.rbegin(), vec.rend())) 轻松获得。对于复杂的、多条件的排序Lambda表达式是最佳工具。注意迭代器有效性确保传递给sort的迭代器范围是有效的并且在排序过程中该范围内的元素不会被其他线程修改。性能不是首要担忧对于内置类型和简单的比较std::greater、Lambda和手写循环的性能在优化后几乎没有差异。应将代码清晰性和正确性放在首位。善用其他排序相关算法STL不只有sort。了解stable_sort稳定排序、partial_sort部分排序、nth_element找第n大元素等它们在某些特定场景下效率更高。6. 从greaterT看STL的设计哲学通过std::greaterT这个小小的函数对象我们可以体会到C标准模板库STL几个强大的设计思想泛型编程Generic Programmingstd::greater是一个模板类可以用于任何定义了operator的类型或特化了std::greater的类型。这种“一次编写多处使用”的能力极大地提高了代码的复用性。算法与数据的分离std::sort算法只负责排序的逻辑它不关心具体排序什么数据、按什么规则排序。排序规则通过“比较器”这个策略Strategy对象注入。这种设计使得算法高度通用greater正是众多比较策略中的一种。通过函数对象实现策略模式在面向对象设计中策略模式允许在运行时选择算法。在STL中通过模板和函数对象我们可以在编译时选择不同的比较策略如less、greater或自定义函数对象既灵活又保证了零开销抽象Zero-cost Abstraction。函数对象具有operator()的类比普通函数指针更强大因为它可以拥有状态。正交性与可组合性STL的组件像乐高积木。sort算法、各种容器、迭代器、以及像greater这样的函数对象都是独立的、正交的组件。你可以用sort配vector也可以配deque可以用默认的less也可以用greater甚至可以用一个先比较姓名再比较年龄的复杂函数对象。这种可组合性赋予了C程序员极大的表达能力和灵活性。因此掌握std::greater不仅仅是为了写一句降序排序更是理解STL这种“将通用算法与数据结构及策略分离”的编程范式。下次当你需要反向排序时熟练地写下std::sort(begin, end, std::greaterT())这代表你的C代码正在向更标准、更优雅、更高效的方向迈进。

相关新闻

CUDA程序在苹果GPU上运行:跨平台GPU计算新突破

CUDA程序在苹果GPU上运行:跨平台GPU计算新突破

这次我们来看一个技术突破:CUDA源码成功在苹果GPU上运行。这意味着原本只能在NVIDIA显卡上运行的CUDA程序,现在可以在苹果M系列芯片的GPU上执行,为跨平台GPU计算打开了新可能。这个项目的核心价值在于打破了NVIDIA CUDA的生态壁垒。苹果自研芯…

2026/10/8 16:01:18 阅读更多 →
3大核心优势揭秘:为什么Ryujinx成为Switch模拟器的终极选择?

3大核心优势揭秘:为什么Ryujinx成为Switch模拟器的终极选择?

3大核心优势揭秘:为什么Ryujinx成为Switch模拟器的终极选择? 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx 想在电脑上畅玩Switch游戏却不知从何入手&#xff…

2026/10/16 3:07:59 阅读更多 →
【单片机毕业设计推荐】基于 STM32 或 51 单片机的温度监测与蓝牙报警系统设计,基于 STM32 或 51 单片机的 DS18B20 温度采集与 LCD1602 显示系统设计(022803)

【单片机毕业设计推荐】基于 STM32 或 51 单片机的温度监测与蓝牙报警系统设计,基于 STM32 或 51 单片机的 DS18B20 温度采集与 LCD1602 显示系统设计(022803)

文章目录20 个相关毕业设计备选题目项目研究背景摘要总体方案核心功能基础功能核心功能辅助功能技术路线项目演示关于我们项目案例源码获取温馨提示:本人主页置顶文章(点我)有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶…

2026/10/13 5:26:04 阅读更多 →

最新新闻

MP2642GR-Z+STM32F415RG双串锂电主动均衡方案

MP2642GR-Z+STM32F415RG双串锂电主动均衡方案

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

2026/10/17 1:06:16 阅读更多 →
微信小程序图片上传全链路实战:单图、多图、头像上传与失败排查

微信小程序图片上传全链路实战:单图、多图、头像上传与失败排查

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

2026/10/17 1:06:16 阅读更多 →
Windows下用MinGW构建HDF5的完整方案:CMake配置与避坑指南

Windows下用MinGW构建HDF5的完整方案:CMake配置与避坑指南

简介:这份HDF5 mingw版本是面向Windows环境下使用MinGW编译器进行C开发的预编译库资源。HDF5作为科学计算与数据分析领域常用的层级数据存储格式,支持复杂数据类型与高效数据访问;该版本针对Mingw73_32环境优化,配合CMake即可快速…

2026/10/17 1:06:16 阅读更多 →
专科生毕业论文AI工具测评:从选题到降重全流程拆解

专科生毕业论文AI工具测评:从选题到降重全流程拆解

专科生写论文这件事,放到网上一搜,冒出来最多的就是"AI论文写作软件"和"一键生成论文"这俩词。作为一个带过不少专科毕业设计的人,我可以直接告诉你:那些号称"一键生成"的,十个里有九个…

2026/10/17 1:06:15 阅读更多 →
ARM裸机开发:软件中断SWI从原理到系统调用实现

ARM裸机开发:软件中断SWI从原理到系统调用实现

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

2026/10/17 1:06:15 阅读更多 →
储能电池均衡方案选型与实现:MP2642GR-Z与PIC18F66K40硬件软件全解析

储能电池均衡方案选型与实现:MP2642GR-Z与PIC18F66K40硬件软件全解析

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

2026/10/17 1:05:15 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/16 21:35:51 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →