【STL】 set 与 multiset:基础、操作与应用
在 C++ 标准库中,set 和 multiset 是两个非常常见的关联容器,主要用于存储和管理具有一定规则的数据集合。本文将详细讲解如何使用这两个容器,并结合实例代码,分析其操作和特性。
0.基础操作概览
0.1.构造:
set<T> st;
// 默认构造函数:set(const set& st);
//拷贝构造函数
0.2.赋值:
set& operator=(const set& st);
//重载等号操作符
0.3.统计set容器大小以及交换set容器
size();
//返回容器中元素的数目empty();
//判断容器是否为空swap(st); //交换两个集合容器
0.4.set容器进行插入数据和删除数据
insert(elem);
//在容器中插入元素。 clear();
// 清除所有元素
erase(pos);
//删除pos迭代器所指的元素,返回下一个元素的迭代器。erase(beg, end);
//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。erase(elem);
//删除容器中值为elem的元素。
0.5.set查找和统计:对set容器进行查找数据以及统计数据
find(key);
//查找key是否存在,若存在,返回该键的元素的迭代器;
//若不存在,返回set.end();count(key);
//对于set而言,统计key的元素个数
//只有两种结果:如果容器中不存在key,返回0; 否则,返回1
0.6.排序
set<int> st1;
// 储存int的集合(从小到大)set<int, greater<int>> st2;
// 储存int的集合(从大到小)
1. set 与 multiset 的基本概念
- set:它是一种自动去重且按顺序排列的集合。每次插入元素时,set 会自动判断该元素是否已存在,若存在则不会插入。
- multiset:允许重复元素的集合,因此可以存储多个相同的元素。
- 关联容器:关联容器中的元素在插入时自动排序,因此不同于顺序容器如 vector 或 list,不需要手动排序。
2. set 容器的构造与赋值
在 C++ 中,set 提供了多种构造方式:
- 默认构造:
set <int> st;创建一个空的整数集合。 - 拷贝构造:
set<int> st2(st);从已有的集合 st 创建一个副本。 - 赋值操作:
set& operator=(const set& st);可以通过重载的 = 操作符将一个集合的内容赋值给另一个集合。
构造与赋值实例:
void test0()
{// 1.默认构造set<int>s;s.insert(1); // 插入元素1s.insert(-4); // 插入元素-4s.insert(2); // 插入元素2s.insert(5); // 插入元素5s.insert(8); // 插入元素8s.insert(1); // 插入重复元素1,自动忽略print(s); // 打印集合中的元素,输出为:-4 1 2 5 8cout << endl;// 2.拷贝构造set<int>s2(s); // 拷贝构造函数print(s2); // 输出:-4 1 2 5 8cout << endl;// 3.赋值操作set<int>s3 = s2; // 赋值操作符print(s3); // 输出:-4 1 2 5 8
}

在此代码中,set 的插入操作可以看出,重复元素(如插入的 1)不会出现在集合中,这是 set 自动去重的特性。
3.遍历 set 容器
在 set 中,不能使用下标访问元素,因此遍历集合有两种常见方式:
- 使用迭代器遍历:通过迭代器访问集合元素,适合所有关联容器。
- 基于范围的 for 循环:简化迭代器操作,代码更加简洁。
迭代器遍历:
void print(set<int>& s){for (set<int>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " "; // 输出每个元素}cout << endl;/*for (auto it = s.begin(); it != s.end(); it++){cout << *it << " ";}*/
}
基于范围的 for 循环
void print(set<int>& s)
{for (int elem : s) {cout << elem << " "; // 直接输出元素}cout << endl;/*for (auto it : s){cout << it << " ";}*/
}
降序遍历:如果集合是降序排序的,例如使用
set<int, greater>,需要在定义迭代器时添加相应的比较器。
void print(set<int, greater<int>>& s)
{for (set<int, greater<int>>::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " "; // 输出降序排列的元素}cout << endl;
}
遍历操作
void test_traversal()
{set<int> s;s.insert(5);s.insert(1);s.insert(3);s.insert(7);cout << "使用迭代器遍历 set:" << endl;print(s); // 输出:1 3 5 7cout << "使用基于范围的 for 循环遍历 set:" << endl;print2(s); // 输出:1 3 5 7
}
总结:遍历 set 的两种方式都非常直观,迭代器方式适合所有关联容器,而基于范围的 for 循环则能让代码更简洁。
5. set 容器的大小统计与交换
size();返回集合中的元素数量。empty();检查集合是否为空,若为空返回 true,否则返回false。swap();交换两个集合的内容。
统计大小与交换:
void test1()
{//构造2个有数据的set容器set<int>s;s.insert(0);s.insert(1);s.insert(0);s.insert(9);s.insert(6);s.insert(11);set<int>s1;s1.insert(0);s1.insert(0);s1.insert(0);s1.insert(99);s1.insert(4);s1.insert(-1);cout << endl;//判断是否为空if (!s.empty()) {cout << "s容器的长度为:" << s.size() << endl;}cout << endl;//交换cout<< "交换前:" << endl;cout << "s: " ;print(s);cout << endl << "s1:";print(s1);s.swap(s1);cout << endl << endl;cout << "交换后:" << endl ;cout << "s: " ;print(s);cout << endl << "s1: ";print(s1);
}

通过 swap() 操作,s 和 s1 的内容得到了交换。这样可以有效简化代码,避免使用临时变量来保存集合的内容。
6. set 容器的插入与删除操作
insert(elem);向集合中插入元素。由于 set 自动排序,插入元素时不会指定位置。
删除元素有三种方式:
-
erase(pos);删除pos迭代器所指的元素,返回下一个元素的迭代器。 -
erase(beg, end);删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。 -
erase(elem);删除容器中值为elem的元素。
void test2()
{set<int>s1;s1.insert(100);s1.insert(100);s1.insert(20);s1.insert(0);s1.insert(44);s1.insert(12);s1.insert(666);s1.insert(9);print(s1);cout << endl;//删除迭代器指定元素s1.erase(s1.begin());//这里删掉的是第一个元素0,因为set容器自动排序print(s1);cout << endl;//删除指定元素s1.erase(20);print(s1);cout << endl;//删除迭代器指定区间元素s1.erase(s1.begin(), s1.end());//等价于清空操作://s1.clear();cout <<"当前s1的大小为:" << s1.size() << endl;
}

在此代码中,我们展示了三种不同的 erase 操作,可以方便地删除单个元素或一组元素。
7. set 容器的查找与统计
find(key);
查找key是否存在,若存在,返回该键的元素的迭代器;
若不存在,返回set.end();
count(key);
对于set而言,统计key的元素个数
只有两种结果:如果容器中不存在key,返回0; 否则,返回1
查找与统计:
void test3(){set<int>s1;s1.insert(1);s1.insert(100);s1.insert(23);s1.insert(0);s1.insert(404);s1.insert(12);s1.insert(999);s1.insert(9);// 查找元素 404auto it = s1.find(404);if (it != s1.end()) {cout << "找到了元素 404" << endl; // 输出:找到了元素404} else {cout << "未找到元素 404" << endl;}// 使用 count 统计元素个数int n = s1.count(404);cout << "s1 中元素 404 的个数为:" << n << endl; // 输出:1
}
通过 find() 和 count() 函数,可以轻松实现元素的查找与存在性检查。
8. set 容器的排序特性
默认情况下,set 按照升序排列。可以通过
set<int, greater<int>> 指定降序排列。
set<int> st1;储存int的集合(从小到大)set<int, greater<int>> st2;储存int的集合(从大到小)
排序:
void test4()
{//默认构造set<int>s1;//等价于set<int, less<int>>s1;s1.insert(10);s1.insert(40);s1.insert(20);s1.insert(0);s1.insert(-10);print(s1);//降序构造,用到比较器greater(类型)cout << endl;set<int, greater<int>>s2;s2.insert(10);s2.insert(40);s2.insert(20);s2.insert(0);s2.insert(-10);print2(s2);
}
通过比较器 greater 可以实现集合的降序排列。
整体操作如下:
//set:自动去重 且 按顺序排列的 集合
//multiset:允许重复元素
//关联容器:插入时自动排序
//只能使用迭代器,基于范围的for循环 进行遍历,不能使用下标访问
#include<iostream>
#include<set>
using namespace std;//1.构造:
//set<T> st; // 默认构造函数:
//set(const set& st); //拷贝构造函数//2.赋值:
//set& operator=(const set& st); //重载等号操作符//3.统计set容器大小以及交换set容器
//size(); //返回容器中元素的数目
//empty(); //判断容器是否为空
//swap(st); //交换两个集合容器//4.set容器进行插入数据和删除数据
//insert(elem); //在容器中插入元素。
//clear(); // 清除所有元素//erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
//erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
//erase(elem); //删除容器中值为elem的元素。//5.set查找和统计:对set容器进行查找数据以及统计数据
//find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
//count(key); //对于set而言,统计key的元素个数:只有两种结果:0和1,如果容器中不存在key,返回0; 否则,返回1//6.排序
//set<int> st1; // 储存int的集合(从小到大)
//set<int, greater<int>> st2; // 储存int的集合(从大到小)//遍历set容器(用迭代器,基于范围for循环)
void print(set<int>& s)
{for (set<int>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}/*for (auto it = s.begin(); it != s.end(); it++){cout << *it << " ";}*//*for (auto it : s){cout << it << " ";}*/}//遍历降序set容器
//注意:如果是降序set容器,在传参,定义迭代器时,都要加上比较器:greater<int>
void print2(set<int,greater<int>>& s)
{for (set<int,greater<int>>::iterator it = s.begin(); it != s.end(); it++){cout << *it << " ";}/*for (auto it = s.begin(); it != s.end(); it++){cout << *it << " ";}*//*for (auto it : s){cout << it << " ";}*/
}//1.构造与赋值
void test0()
{// 1.默认构造set<int>s;s.insert(1); // 插入元素1s.insert(-4); // 插入元素-4s.insert(2); // 插入元素2s.insert(5); // 插入元素5s.insert(8); // 插入元素8s.insert(1); // 插入重复元素1,自动忽略print(s); // 打印集合中的元素,输出为:-4 1 2 5 8cout << endl;// 2.拷贝构造set<int>s2(s); // 拷贝构造函数print(s2); // 输出:-4 1 2 5 8cout << endl;// 3.赋值操作set<int>s3 = s2; // 赋值操作符print(s3); // 输出:-4 1 2 5 8
}//2.统计set容器大小以及交换set容器
void test1()
{//构造2个有数据的set容器set<int>s;s.insert(0);s.insert(1);s.insert(0);s.insert(9);s.insert(6);s.insert(11);set<int>s1;s1.insert(0);s1.insert(0);s1.insert(0);s1.insert(99);s1.insert(4);s1.insert(-1);//判断是否为空if (!s.empty()) {cout << "s容器的长度为:" << s.size() << endl;}cout << endl;//交换cout<< "交换前:" << endl;cout << "s: " ;print(s);cout << endl << "s1:";print(s1);s.swap(s1);cout << endl << endl;cout << "交换后:" << endl ;cout << "s: " ;print(s);cout << endl << "s1: ";print(s1);
}//3.set容器进行插入数据和删除数据
void test2()
{set<int>s1;s1.insert(100);s1.insert(100);s1.insert(20);s1.insert(0);s1.insert(44);s1.insert(12);s1.insert(666);s1.insert(9);print(s1);cout << endl;//删除迭代器指定元素s1.erase(s1.begin());//这里删掉的是第一个元素0,因为set容器自动排序print(s1);cout << endl;//删除指定元素s1.erase(20);print(s1);cout << endl;//删除迭代器指定区间元素s1.erase(s1.begin(), s1.end());//等价于清空操作://s1.clear();cout <<"当前s1的大小为:" << s1.size() << endl;
}//4.set查找和统计:对set容器进行查找数据以及统计数据
void test3()
{set<int>s1;s1.insert(1);s1.insert(100);s1.insert(23);s1.insert(0);s1.insert(404);s1.insert(12);s1.insert(999);s1.insert(9);//查找:返回迭代器//set<int>::iterator it = s1.find(404);//用auto更方便auto it = s1.find(404);if (it != s1.end()){cout << "找到了" << endl;}else{cout << "没找到" << endl;}//统计个数,也可以用来查找int n = s1.count(404);if (n){cout << "找到了" << endl;}else{cout << "没找到" << endl;}cout <<"s1中404的个数为:" << n << endl;
}//5.set容器的指定排序:默认从小到大排序
void test4()
{//默认构造set<int>s1;//等价于set<int, less<int>>s1;s1.insert(10);s1.insert(40);s1.insert(20);s1.insert(0);s1.insert(-10);print(s1);//降序构造,用到比较器greater(类型)cout << endl;set<int, greater<int>>s2;s2.insert(10);s2.insert(40);s2.insert(20);s2.insert(0);s2.insert(-10);print2(s2);}int main()
{test0();test1();test2();test3();test4();return 0;
}
9.相关注意事项
9.1. 自动排序与元素唯一性
自动排序:set 会自动将插入的元素按升序(或根据提供的自定义比较器排序)进行排序。因此,插入顺序与实际存储顺序可能不同。
注意:由于 set 是自动排序的容器,插入操作可能会引发排序操作,这使得插入操作的平均时间复杂度为 O(log n),适合需要快速查找和去重的场景。
元素唯一性:set 不允许重复元素。如果插入的元素已经存在于集合中,set 会自动忽略该元素。即使多次插入相同的值,集合中只会保留一个副本。
set<int> s;
s.insert(1);
s.insert(1); // 插入重复元素,set 会自动忽略
print(s); // 输出:1
9.2. 不能使用下标访问
与 vector 不同,set 作为关联容器不能通过下标访问元素,也不能像顺序容器那样直接修改元素。只能通过迭代器或基于范围的 for 循环来遍历集合。
set<int> s = {10, 20, 30};
// s[0] = 5; // 错误!set 不能使用下标
for (int elem : s)
{cout << elem << " "; // 正确的遍历方式
}
9.3. 修改元素的限制
在 set 中,由于其自动排序的特性,不能直接通过迭代器修改元素的值。如果需要修改元素值,必须先删除该元素,然后插入新的值。
set<int> s = {10, 20, 30};
auto it = s.find(20);
if (it != s.end())
{s.erase(it); // 先删除 20s.insert(25); // 再插入新值 25
}
print(s); // 输出:10 25 30
9.4. 迭代器的有效性
当删除或插入元素时,set 的迭代器可能会失效。特别是在删除操作中,如果需要使用迭代器操作,建议在删除之后重新获取下一个有效的迭代器。
set<int> s = {1, 2, 3, 4, 5};
auto it = s.begin();
while (it != s.end())
{if (*it == 3) {it = s.erase(it); // erase 返回下一个有效迭代器} else {it++;}
}
print(s); // 输出:1 2 4 5
9.6. 自定义排序规则
如果需要按自定义顺序排序 set 中的元素,可以通过传入自定义的比较器来改变排序方式。例如,可以使用 greater 来实现降序排列,或者提供自定义的比较函数。
set<int, greater<int>> s = {10, 20, 30};
print2(s); // 输出:30 20 10
9.8. 避免重复调用 find 和 count
如果你想要同时查找元素和统计某个元素的出现次数,不必重复调用 find() 和 count(),因为 count() 可以直接返回是否存在目标元素(对于 set,返回值只会是 0 或 1)。count() 本质上相当于 find() 的简化版。
set<int> s = {10, 20, 30};
if (s.count(20))
{cout << "元素 20 存在" << endl;
}
相关文章:
【STL】 set 与 multiset:基础、操作与应用
在 C 标准库中,set 和 multiset 是两个非常常见的关联容器,主要用于存储和管理具有一定规则的数据集合。本文将详细讲解如何使用这两个容器,并结合实例代码,分析其操作和特性。 0.基础操作概览 0.1.构造: set<T&…...
xhs 小红书 x-s web 分析
声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 有相关问题请第一时间头像私信联系我…...
胤娲科技:谷歌DeepMind祭出蛋白质设计新AI——癌症治疗迎来曙光
在科技的浩瀚星空中,DeepMind的“阿尔法”家族总是能带来令人瞩目的璀璨光芒。这一次,它们再次以惊人的姿态, 将AI的触角深入到了生命的微观世界——蛋白质设计领域,为我们描绘了一幅未来医疗的宏伟蓝图。 想象一下,一…...
【后端】【nginx】nginx常用命令
文章目录 1. 启动与停止相关命令2. 配置文件检查与验证3. 查看日志4. 查看状态与版本5. 端口与连接相关命令 1. 启动与停止相关命令 # 启动 NGINX sudo nginx# 立即停止 NGINX sudo nginx -s stop# 优雅停止 NGINX sudo nginx -s quit# 优雅重载配置 sudo nginx -s reload# 完…...
MATLAB系列08:输入/输入函数
MATLAB系列08:输入/输入函数 8. 输入/输入函数8.1 函数textread8.2 关于load和save命令的进一步说明8.3 MATLAB文件过程简介8.4 文件的打开和关闭8.4.1 fopen函数8.4.2 fclose函数 8.5 二进制 I/O 函数8.5.1 fwrite 函数8.5.2 fread函数 8.6 格式化 I/O 函数8.6.1 f…...
《财富之眼:用经济思维看清世界》pdf电子书下载
《财富之眼:用经济思维看清世界》pdf电子书下载 内容简介 一切社会现象都是经济现象,我们只能赚到自己认知范围内的 钱。我国社会主要矛盾已经转化为人民日益增长的美好生活需要和不 平衡不充分的发展之间的矛盾,其中“不平衡不充分”很大程…...
QT中文乱码
文章目录 方法一方法二 方法一 fromLocal8Bit() 可以把中文转为Unicode eg:QString str QString::fromLocal8Bit(“中文简体”); 方法二 预处理,根据设置的本地字符集转换,能正确转换含有中文的QString。 #pragma execution_character_set("u…...
如何安装1Panel面板并架设一个静态网站
我们通常要架设网站在vps上,就要用到面板,一般是宝塔,但这个面板收费项目较多,用着不太方便。相比宝塔面板,1panel面板是国内功能强大、操作简单、免费易学的Linux服务器管理面板。我们还可以使用一键代码来安装这个面…...
craco-less使用问题
craco-less使用问题 问题背景 前端是用React搭建,使用craco配置,相关库或插件版本如下 "craco/craco": "^7.1.0","react-scripts": "^5.0.1","craco-less": "^3.0.1"在生产环境ÿ…...
14 vue3之内置组件trastion全系列
前置知识 Vue 提供了 transition 的封装组件,在下列情形中,可以给任何元素和组件添加进入/离开过渡: 条件渲染 (使用 v-if)条件展示 (使用 v-show)动态组件组件根节点 自定义 transition 过度效果,你需要对transition组件的name属性自定义。…...
力扣(leetcode)每日一题 LCR 187 破冰游戏(还是考的约瑟夫环)
题干 社团共有 num 位成员参与破冰游戏,编号为 0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字 target,从 0 号成员起开始计数,排在第 target 位的成员离开圆桌,且成员离开后从下一个成员开始计数。请返回游戏结束…...
nginx模块篇(四)
文章目录 四、Nginx的扩展模块4.1. Lua4.1.1 概念4.1.2 特性4.1.3 应用场景4.1.4 Lua的安装4.1.5 Lua的语法4.1.5.1 第一个Lua程序4.1.5.2 Lua的注释4.1.5.3 标识符4.1.5.4 关键字4.1.5.5 运算符4.1.5.6 全局变量&局部变量4.1.5.7 Lua数据类型nilbooleannumberstringtablef…...
奇安信渗透2面经验分享
《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…...
【计算机网络篇】电路交换,报文交换,分组交换
本文主要介绍计算机网络中的电路交换,报文交换,分组交换,文中的内容是我认为的重点内容,并非所有。参考的教材是谢希仁老师编著的《计算机网络》第8版。跟学视频课为河南科技大学郑瑞娟老师所讲计网。 目录 🎯一.划分…...
【TypeScript入坑】什么是TypeScript?
TypeScript入坑 什么是 TypeScriptTypeScript 的优势 什么是 TypeScript TypeScript:是 JavaScript 的超集,拥有类型机制,不会再浏览器直接执行,而是编译成 JavaScript 后才会运行。 超集(superset)&…...
Agile Modbus STM32裸机移植 从机使用
本教程手把手教你实现Agile Modbus,照抄就能成。 并且会解读函数功能含义。 1. 引言 Agile Modbus 是一个轻量级的 Modbus 协议栈,可以满足用户在任何场景下的需求。 功能 支持 rtu 和 tcp 协议,使用纯 C 语言开发,不涉及任何硬件接口,可以直接在任何形式的硬件上使用。由…...
mysql5.7.44安装教程
mysql5.7.44安装教程 1.windows 二进制压缩包从MySQL官网下载即可。 2.解压后,在根目录下创建my.ini文件 [mysql] # 设置 mysql 客户端默认字符集 default-character-setutf8 [mysqld] #设置 3306 端口 port 3306 # 设置 mysql 的安装目录 basedir …...
etsts
Dockerfile FROM apache/flink:1.19-scala_2.12-java8 RUN mkdir -p $FLINK_HOME/usrlib COPY MysqlFlinkCdcToKafka-jar-with-dependencies.jar $FLINK_HOME/usrlib/MysqlFlinkCdcToKafka-jar-with-dependencies.jar 构建镜像的命令 docker buildx build --load --platform l…...
C++_22_异常
文章目录 异常概念:**抛出异常:**关键字: **捕获异常:****栈解旋:****异常的接口声明:****异常对象的生命周期:**1 传递异常对象【不使用】2 传递异常对象指针【不使用】3 传递异常对象引用【**…...
开源 AI 智能名片链动 2+1 模式 O2O 商城小程序在社群活动中的应用与时机选择
摘要:本文探讨了开源 AI 智能名片链动 21 模式 O2O 商城小程序在社群经济中的重要性,着重分析了如何借助该小程序适时举办大型活动以维持和引爆社群活跃度。通过对活动时机选择的研究,强调了针对社群用户量身定制活动时机的必要性,…...
解决Modelsim SE 10.6c仿真Vivado 2019乘法器IP核的“.vhd only”难题(附完整脚本)
解决Modelsim SE 10.6c仿真Vivado 2019乘法器IP核的“.vhd only”难题(附完整脚本) 在FPGA设计流程中,Xilinx Vivado与Mentor Modelsim的组合是许多工程师的首选工具链。但当Vivado 2019生成的乘法器IP核仅提供VHDL接口文件(.vhd)时ÿ…...
基于 HM-TM32 红外摄像头:棉花燃烧+起火自动录制 30 秒视频
在棉花仓储、纺织原料监测等实际场景中,利用 HM-TM32 微型红外测温机芯实现非接触式火情监测具备极高的实用价值,本文基于 Windows 笔记本环境,实现红外摄像头实时画面显示,并在检测到棉花起火或高温异常时自动录制 30 秒视频留存…...
大模型学习指南:小白也能轻松掌握AI,提升效率与收入(收藏版)
本文针对想学习大模型的普通用户,破除学习AI的常见误区,提供实用学习路径。文章强调从实际应用场景出发,而非深入技术原理,介绍了如何利用AI提升办公效率、进行内容创作、结合本职工作以及构建个人智能体助手。此外,文…...
电力系统网络安全:从风险认知到威胁建模的实战指南
1. 从日常运维到风险认知:重新审视大容量电力系统的安全基线在能源行业干了十几年,我见过太多同行把大容量电力系统(Bulk Energy System, BES)的运维简化为“确保别停电”。日常的告警处理、设备巡检、工单流转构成了工作的全部叙…...
微信视频下载器wx_channels_download
微信视频下载器ltaoo/wx_channels_download(跨平台轻量首选) 特点:体积小、使用简单,在微信PC端视频下方添加“下载”按钮;支持 macOS 和 Windows。优点:集成式(无需单独监听)&…...
MODLR Studio光标操作插件开发:提升数据建模效率的交互优化实践
1. 项目概述与核心价值 最近在数据建模和可视化领域,一个名为 MODLR-Studio/modlr_cursor_ops 的项目引起了我的注意。乍一看这个标题,可能有些朋友会感到困惑:“MODLR”是什么?“Cursor Ops”又是指什么操作?这其实…...
市场营销Agent:自动生成内容与投放策略
市场营销Agent:自动生成内容与投放策略——从痛点分析到落地实践的全栈指南 引言 痛点引入 在数字营销的战场上,每天都有无数的团队在重复着「内容绞肉机」和「投放试错场」的噩梦: 内容产出端:为了覆盖小红书、抖音、知乎、微信公众号、TikTok、LinkedIn等数十个主流渠…...
ClaudeCode入门08-Git配合(小白入门:不知道怎么写Git提交记录?让AI自动帮你写好)
🎯 本文目标 学会用 Claude Code 自动化 Git 工作流:自动写 Commit Message、管理分支、处理冲突。 😰 Git 新手的痛点 git commit -m "fix" git commit -m "update" git commit -m "修改了一些东西" 不知道 Conventional Commits 是什么 …...
题目五:抽象类 + 接口 混合实现
编程要求:抽象类 Machine:抽象方法 work(),普通方法 start();接口 Clean:抽象方法 clean();类 Robot继承抽象类 Machine 实现接口 Clean;实现所有未实现的方法;测试创建机器人对象&…...
S32K144开发板调试实战:除了点灯,如何用S32DS的调试窗口快速排查变量异常问题?
S32K144开发板调试实战:变量异常排查与高效调试技巧 调试嵌入式系统时,最令人头疼的莫过于程序看似正常运行,但某些变量值却莫名其妙地偏离预期。作为一名长期使用S32 Design Studio(S32DS)进行S32K144开发的工程师&a…...
