【C++】set、map 容器的使用
文章目录
- 1. set 和 multiset 的使用
- 1.1 set类的介绍
- 1.2 set的构造和迭代器
- 1.3 set 的增删查
- 1.4 insert和迭代器调用示例
- 1.5 find和erase使用示例
- 1.6 multiset和set的差异
- 2. map 和 multimap 的使用
- 2.1 map 类的介绍
- 2.2 pair 类型介绍
- 2.3 map 的构造和迭代器
- 2.4 map 的增删查
- 2.5 map 的数据修改
- 2.6 构造遍历及增删查使用示例
- 2.7 map 的迭代器和 [] 功能示例
- 2.8 multimap和map的差异
1. set 和 multiset 的使用
1.1 set类的介绍
- set的声明如下,T就是set底层关键字的类型
- set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数
- set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。
- 一般情况下,我们都不需要传后两个模版参数。
- set底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。
- 前面部分我们已经学习了vector/list等容器的使用,STL容器接口设计,高度相似,所以这里我们就不再一个接口一个接口的介绍。
template < class T, // set::key_type/value_typeclass Compare = less<T>, // set::key_compare/value_compareclass Alloc = allocator<T> // set::allocator_type> class set;
1.2 set的构造和迭代器
set的构造我们关注以下几个接口即可。
set的支持正向和反向迭代遍历,遍历默认按升序顺序,因为底层是二叉搜索树,迭代器遍历走的中序;支持迭代器就意味着支持范围for,set的iterator和const_iterator都不支持迭代器修改数据,修改关键字数据,破坏了底层搜索树的结构。
// empty (1) 无参默认构造
explicit set(const key_compare& comp = key_compare(),const allocator_type& alloc = allocator_type());
// range (2) 迭代器区间构造
template <class InputIterator>
set(InputIterator first, InputIterator last,const key_compare& comp = key_compare(),const allocator_type & = allocator_type());
// copy (3) 拷贝构造
set(const set& x);
// initializer list (5) initializer 列表构造
set(initializer_list<value_type> il,const key_compare& comp = key_compare(),const allocator_type& alloc = allocator_type());
// 迭代器是⼀个双向迭代器
iterator->a bidirectional iterator to const value_type
// 正向迭代器
iterator begin();
iterator end();
// 反向迭代器
reverse_iterator rbegin();
reverse_iterator rend();
1.3 set 的增删查
常用的几个接口:
// 单个数据插入,如果已经存在则插入失败
pair<iterator, bool> insert(const value_type& val);
// 列表插入,已经在容器中存在的值不会插入
void insert(initializer_list<value_type> il);
// 迭代器区间插入,已经在容器中存在的值不会插入
template <class InputIterator>
void insert(InputIterator first, InputIterator last);
// 查找val,返回val所在的迭代器,没有找到返回end()
iterator find(const value_type& val);
// 查找val,返回Val的个数
size_type count(const value_type& val) const;
// 删除一个迭代器位置的值
iterator erase(const_iterator position);
// 删除val,val不存在返回0,存在返回1
size_type erase(const value_type& val);
// 删除一段迭代器区间的值
iterator erase(const_iterator first, const_iterator last);
// 返回大于等val位置的迭代器
iterator lower_bound(const value_type& val) const;
// 返回大于val位置的迭代器
iterator upper_bound(const value_type& val) const;
1.4 insert和迭代器调用示例
void test1()
{// 去重+升序排序set<int> s;// 去重+降序排序(给一个大于的仿函数)//set<int, greater<int>> s;s.insert(5);s.insert(2);s.insert(7);s.insert(5);//set<int>::iterator it = s.begin();auto it = s.begin();while (it != s.end()){// error C3892: “it”: 不能给常量赋值// *it = 1;cout << *it << " ";++it;} cout << endl;// 插入一段initializer_list列表值,已经存在的值插入失败s.insert({ 2,8,3,9 });for (auto e : s){cout << e << " ";} cout << endl;set<string> strset = { "sort", "insert", "add" };// 遍历string比较ascll码大小顺序遍历的for (auto& e : strset){cout << e << " ";} cout << endl;
}
1.5 find和erase使用示例
void test2()
{set<int> s = { 4,2,7,2,8,5,9 };for (auto e : s){cout << e << " ";} cout << endl;// 删除最小值s.erase(s.begin());for (auto e : s){cout << e << " ";}cout << endl;// 直接删除xint x;cin >> x;int num = s.erase(x);if (num == 0){cout << x << "不存在!" << endl;} for (auto e : s){cout << e << " ";} cout << endl;// 直接查找在利用迭代器删除xcin >> x;auto pos = s.find(x);if (pos != s.end()){s.erase(pos);} else{cout << x << "不存在!" << endl;} for (auto e : s){cout << e << " ";} cout << endl;// 算法库的查找 O(N)auto pos1 = find(s.begin(), s.end(), x);// set自身实现的查找 O(logN)auto pos2 = s.find(x);// 利用count间接实现快速查找cin >> x;if (s.count(x)){cout << x << "在!" << endl;}else{cout << x << "不存在!" << endl;}
}
1.6 multiset和set的差异
multiset和set的使用基本完全类似,主要区别点在于 multiset 的 键 允许重复,可存储多个相同值的元素,而 set 的 键 唯一,不允许重复元素。
,具体参看下面的样例代码理解。
#include <iostream>
#include <set>int main()
{std::set<int> s = {1, 2, 2, 3}; // 实际存储 {1, 2, 3}std::multiset<int> ms = {1, 2, 2, 3}; // 存储 {1, 2, 2, 3}std::cout << "set size: " << s.size() << "\n"; // 输出 3std::cout << "multiset size: " << ms.size() << "\n";// 输出 4
}
同样的,在删除时,multiset 也会删除所有匹配 key 的元素,而 set 只会删除一个匹配元素。
std::multiset<int> ms = {2, 2, 3};
ms.erase(2); // 删除所有2 → 剩余 {3}std::set<int> s = {2, 3};
s.erase(2); // 删除2 → 剩余 {3}
在查找时 multiset 返回键的出现次数(可能 >1),而 set 返回 0 或 1。
std::multiset<int> ms = {1, 2, 2, 3};
std::cout << ms.count(2); // 输出 2std::set<int> s = {1, 2, 3};
std::cout << s.count(2); // 输出 1
迭代器遍历时,multiset 的相同值是连续出现的
std::multiset<int> ms = {3, 1, 2, 2};
for (int num : ms)
{std::cout << num << " "; // 输出: 1 2 2 3
}std::set<int> s = {3, 1, 2, 2};
for (int num : s)
{std::cout << num << " "; // 输出: 1 2 3
}
multiset 的特殊方法
multiset 提供额外方法处理重复键:
- equal_range(key):返回一个迭代器对,表示所有匹配 key 的元素范围。
- lower_bound(key)/upper_bound(key):配合范围操作。
std::multiset<int> ms = {1, 2, 2, 3};
auto [first, last] = ms.equal_range(2);
for (auto it = first; it != last; ++it)
{std::cout << *it << " "; // 输出: 2 2
}
总结
特性 | set | multiset |
---|---|---|
键唯一性 | 唯一 | 允许重复 |
插入行为 | 忽略重复 | 接受重复 |
删除行为 | 删除单个匹配元素 | 删除所有匹配元素 |
查找结果 | 存在性检查(0或1) | 统计出现次数(>=0) |
典型应用 | 唯一键管理 | 允许重复的有序数据场景 |
2. map 和 multimap 的使用
2.1 map 类的介绍
map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持小于比较,如果不支持或者需要的话可以自行实现仿函数传给第二个模版参数,map底层存储数据的内存是从空间配置器申请的。一般情况下,我们都不需要传后两个模版参数。map底层是用红黑树实现,增删查改效率是O(logN),迭代器遍历是走的中序,所以是按key有序顺序遍历的。
template < class Key, // map::key_typeclass T, // map::mapped_typeclass Compare = less<Key>, // map::key_compareclass Alloc = allocator<pair<const Key, T> > // map::allocator_type> class map;
2.2 pair 类型介绍
map底层的红黑树节点中的数据,使⽤pair<Key, T>存储键值对数据。
typedef pair<const Key, T> value_type;
template <class T1, class T2>
struct pair
{typedef T1 first_type;typedef T2 second_type;T1 first;T2 second;pair() : first(T1()), second(T2()){}pair(const T1& a, const T2& b) : first(a), second(b){}template<class U, class V>pair(const pair<U, V>& pr) : first(pr.first), second(pr.second){}
};
template <class T1, class T2>
inline pair<T1, T2> make_pair(T1 x, T2 y)
{return (pair<T1, T2>(x, y));
}
2.3 map 的构造和迭代器
// empty (1) 无参默认构造
explicit map(const key_compare& comp = key_compare(),const allocator_type& alloc = allocator_type());
// range (2) 迭代器区间构造
template <class InputIterator>
map(InputIterator first, InputIterator last,const key_compare& comp = key_compare(),const allocator_type & = allocator_type());
// copy (3) 拷⻉构造
map(const map& x);
// initializer list (5) initializer 列表构造
map(initializer_list<value_type> il,const key_compare& comp = key_compare(),const allocator_type& alloc = allocator_type());
// 迭代器是一个双向迭代器
iterator->a bidirectional iterator to const value_type
// 正向迭代器
iterator begin();
iterator end();
// 反向迭代器
reverse_iterator rbegin();
reverse_iterator rend();
2.4 map 的增删查
常用的几个接口:
// 单个数据插入,如果已经key存在则插入失败,key存在相等value不相等也会插入失败
pair<iterator, bool> insert(const value_type& val);
// 列表插入,已经在容器中存在的值不会插入
void insert(initializer_list<value_type> il);
// 迭代器区间插入,已经在容器中存在的值不会插入
template <class InputIterator>
void insert(InputIterator first, InputIterator last);
// 查找k,返回k所在的迭代器,没有找到返回end()
iterator find(const key_type& k);
// 查找k,返回k的个数
size_type count(const key_type& k) const;
// 删除一个迭代器位置的值
iterator erase(const_iterator position);
// 删除k,k存在返回0,存在返回1
size_type erase(const key_type& k);
// 删除一段迭代器区间的值
iterator erase(const_iterator first, const_iterator last);
// 返回大于等k位置的迭代器
iterator lower_bound(const key_type& k);
// 返回大于k位置的迭代器
const_iterator lower_bound(const key_type& k) const;
2.5 map 的数据修改
前面的 set 不支持修改,是因为它要修改只能修改 key,而它的 key 一旦修改,就可能破坏底层数据结构红黑树。map 可以修改,值的是能够修改它的 value,它的 key 同样也不能修改,若修改会破坏底层数据结构。
map第一个支持修改的方式是通过迭代器,迭代器遍历时或者find返回key所在的iterator修改,map 还有一个非常重要的修改接口operator[],但是operator[]不仅仅支持修改,还支持插入数据和查找数据,所以他是一个多功能复合接口
需要注意从内部实现角度,map这里把我们传统说的value值,给的是T类型,typedef为 mapped_type。而 value_type是红黑树结点中存储的pair键值对值。日常使用我们还是习惯将这里的T映射值叫做value。
Member types
key_type->The first template parameter(Key)
mapped_type->The second template parameter(T)
value_type->pair<const key_type, mapped_type>
// 查找k,返回k所在的迭代器,没有找到返回end(),如果找到了通过iterator可以修改key对应的mapped_type值
iterator find(const key_type& k);// insert插入⼀个pair<key, T>对象
// 1、如果key已经在map中,插入失败,则返回⼀个pair<iterator,bool>对象,返回pair对象
// first是key所在结点的迭代器,second是false
// 2、如果key不在在map中,插入成功,则返回⼀个pair<iterator,bool>对象,返回pair对象
// first是新插入key所在结点的迭代器,second是true
// 也就是说入论插入成功还是失败,返回pair<iterator,bool>对象的first都会指向key所在的迭代器
// 那么也就意味着insert插入失败时充当了查找的功能,正是因为这一点,insert可以用来实现
operator[]
// 需要注意的是这里有两个pair,不要混淆了,⼀个是map底层红黑树节点中存的pair<key, T>,另
⼀个是insert返回值pair<iterator, bool>
pair<iterator, bool> insert(const value_type& val);
mapped_type& operator[] (const key_type& k);
// operator的内部实现
mapped_type& operator[] (const key_type& k)
{// 1、如果k不在map中,insert会插入k和mapped_type默认值,同时[]返回结点中存储// mapped_type值的引用,那么我们可以通过引用修改返映射值。所以[]具备了插入 + 修改功能// 2、如果k在map中,insert会插入失败,但是insert返回pair对象的first是指向key结点的// 迭代器,返回值同时[]返回结点中存储mapped_type值的引用,所以[]具备了查找 + 修改的功能pair<iterator, bool> ret = insert({ k, mapped_type() });iterator it = ret.first;return it->second;
}
2.6 构造遍历及增删查使用示例
void test3()
{// initializer_list构造及迭代遍历map<string, string> dict = { {"left", "左边"}, {"right", "右边"},{"insert", "插入"},{ "string", "字符串" } };//map<string, string>::iterator it = dict.begin();auto it = dict.begin();while (it != dict.end()){//cout << (*it).first <<":"<<(*it).second << endl;// map的迭代基本都使用operator->,这里省略了一个->// 第一个->是迭代器运算符重载,返回pair*,第二个箭头是结构指针解引用取pair数据//cout << it.operator->()->first << ":" << it.operator->()-> second << endl;cout << it->first << ":" << it->second << endl;++it;}cout << endl;// insert插入pair对象的4种方式,对⽐之下,最后⼀种最方便pair<string, string> kv1("first", "第一个");dict.insert(kv1);dict.insert(pair<string, string>("second", "第二个"));dict.insert(make_pair("sort", "排序"));dict.insert({ "auto", "自动的" });// "left"已经存在,插入失败dict.insert({ "left", "左边,剩余" });// 范围for遍历for (const auto& e : dict){cout << e.first << ":" << e.second << endl;}cout << endl;string str;while (cin >> str){auto ret = dict.find(str);if (ret != dict.end()){cout << "->" << ret->second << endl;}else{cout << "无此单词,请重新输入" << endl;}}
}
2.7 map 的迭代器和 [] 功能示例
void test4()
{// 利用find和iterator修改功能,统计水果出现的次数string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉" };map<string, int> countMap;for (const auto& str : arr){// 先查找水果在不在map中// 1、不在,说明水果第一次出现,则插入{水果, 1}// 2、在,则查找到的节点中水果对应的次数++auto ret = countMap.find(str);if (ret == countMap.end()){countMap.insert({ str, 1 });}else{ret->second++;}}for (const auto& e : countMap){cout << e.first << ":" << e.second << endl;}cout << endl;
}
void test5()
{// 利用[]插入+修改功能,巧妙实现统计水果出现的次数string arr[] = { "苹果", "西瓜", "苹果", "西瓜", "苹果", "苹果", "西瓜","苹果", "香蕉", "苹果", "香蕉" };map<string, int> countMap;for (const auto& str : arr){// []先查找水果在不在map中// 1、不在,说明⽔果第⼀次出现,则插入{⽔果, 0},同时返回次数的引用,++一下就变成1次了// 2、在,则返回水果对应的次数++countMap[str]++;} for (const auto & e : countMap){cout << e.first << ":" << e.second << endl;} cout << endl;
}
void test6()
{map<string, string> dict;dict.insert(make_pair("sort", "排序"));// key不存在->插入 {"insert", string()}dict["insert"];// 插入+修改dict["left"] = "左边";// 修改dict["left"] = "左边、剩余";// key存在->查找cout << dict["left"] << endl;
}
2.8 multimap和map的差异
multimap和map的使用基本完全类似,主要区别点在于multimap支持关键值key冗余,那么insert/find/count/erase都围绕着支持关键值key冗余有所差异,这里跟set和multiset完全一样,比如find时,有多个key,返回中序第一个。其次就是multimap不支持[],因为支持key冗余,[]就只能支持插入了,不能支持修改。
相关文章:

【C++】set、map 容器的使用
文章目录 1. set 和 multiset 的使用1.1 set类的介绍1.2 set的构造和迭代器1.3 set 的增删查1.4 insert和迭代器调用示例1.5 find和erase使用示例1.6 multiset和set的差异 2. map 和 multimap 的使用2.1 map 类的介绍2.2 pair 类型介绍2.3 map 的构造和迭代器2.4 map 的增删查2…...

【MySQL】第1节|全面理解MySQL架构
快速安装MySQL 使用Docker快速安装mysql8 docker run -d \ --name mysql8 \ --privilegedtrue \ --restartalways \ -p 13306:3306 \ -v /home/mysql8/data:/var/lib/mysql \ -v /home/mysql8/config:/etc/mysql/conf.d \ -v /home/mysql8/logs:/logs \ -e MYSQL_ROOT_PAS…...

YOLOv8模型剪枝笔记(DepGraph和Network Slimming网络瘦身)
文章目录 一、DepGraph剪枝(1)项目准备1)剪枝基础知识2)DepGraph剪枝论文解读12)DepGraph剪枝论文解读23)YOLO目标检测系列发展史4)YOLO网络架构 (2)项目实战(…...

App Builder技术选型指南:从AI编程到小程序容器,外卖App开发实战
在2025年快速迭代的技术生态中,开发者构建App的路径愈发多样化。本文以开发一个同城外卖App为例,对比当前主流的AI编程工具(如Cursor、GitHub Copilot、Trae)与小程序容器技术(如FinClip)的优劣势、难易度及…...

TDengine 高可用——三副本
概述 TDengine 的三副本方案采用 RAFT 算法来实现数据的一致性,包括元数据和时序数据。一个虚拟节点组(VGroup)构成了一个 RAFT 组;VGroup 中的虚拟节点(Vnode),便是该 RAFT 组的成员节点&…...

el-table高度自适应、数据查询后高度展示错误问题
在很多场景中我们需要实现表格的高度自适应,即不同屏幕大小下需要使用不同的高度来设置表格,那么我们应该如何实现呢? 1.el-table实现高度自适应 通过以下代码可以实现表格根据屏幕进行自适应 设置表格的高度 <el-table ref"tableD…...
【蓝桥杯真题精讲】第 16 届 Python A 组(省赛)
文章目录 T1 偏蓝 (5/5)T2 IPv6 (0/5)T3 2025 图形 (10/10)T4 最大数字 (10/10)T5 倒水 (15/15)T6 拼好数 (0/15)T7 登山 (20/20)T8 原料采购 (20/20) 更好的阅读体验 高速访问:https://wiki.dwj601.cn/ds-and-algo/lan-qiao-cup/16th-python-a/永久链接࿱…...

Java接口设计:ECharts热力图的绘制
引言 热力图是一种强大的数据可视化工具,通过颜色的深浅变化来直观展示数据密度和分布情况。在现代Web应用中,ECharts作为一款流行的开源数据可视化库,提供了丰富的图表类型,其中热力图因其直观的视觉效果而被广泛使用。本教程将…...

深入理解 MongoDB 的 _id 和 ObjectId:从原理到实践
在 MongoDB 的世界中,_id 字段和 ObjectId 是每个开发者都必须理解的核心概念。作为 MongoDB 文档的唯一标识符,它们不仅影响着数据库的设计,也直接关系到应用的性能和扩展性。本文将全面剖析 _id 和 ObjectId 的工作原理、实际应用场景以及最…...
C++内存复制
C内存复制 方法1 g_savedPoints.resize(pResult->contourData.contourPointCount);//方法1std::copy(pResult->contourData.pointArray, pResult->contourData.pointArray pResult->contourData.contourPointCount, g_savedPoints.begin());方法2 g_savedPoints.r…...

【notepad++如何设置成中文界面呢?】
“Notepad”是一款非常强大的文本编辑软件,将其界面设置成中文的方法如下: 一、工具/原料: 华为 Matebook 15、Windows 10、Notepad 8.4.6。 二 、具体步骤: 1、找到任意一个文本文件,比如 txt 格式的文…...

当AI遇上科研:北大“科学导航”重塑学术探索全流程
在人工智能技术迅猛发展的当下,一场悄然发生的变革,正在改变我们“做科研”的方式。近日,北京大学科学智能研究院联合深势科技,正式上线一款面向科研人员的一体化AI平台——Science Navigator(科学导航)。这…...
大模型在闭合性胫骨平台骨折诊疗全流程中的应用研究报告
目录 一、引言 1.1 研究背景与目的 1.2 国内外研究现状 1.3 研究方法与创新点 二、大模型预测原理及数据基础 2.1 大模型概述 2.2 数据收集与处理 2.3 模型训练与优化 三、术前预测与方案制定 3.1 骨折类型及损伤程度预测 3.2 手术时机评估 3.3 手术方案制定 3.4 …...

PHP学习笔记(八)
目录 返回值 return的使用 多值返回的替代方案 可变函数 内部(内置)函数 匿名函数 静态匿名函数 返回值 值通过可选参数的返回语句返回 return的使用 函数不能返回多个值,但可以通过返回一个数组来得到类似的效果 函数返回一个引用&am…...

C#中WSDL文件引用问题
工作中碰到一个单点登录的需求,因为这个需求同事别的系统已经做过,我这边只需要把代码迁移过来即可,但是迁移过程中发现引用WSDL文件后,方法报错的问题,各种排查代码之后未解决,最终发现是WSDL文件引用的问…...
Ubuntu 22.04上升级Node.js版本
在Ubuntu 22.04上升级Node.js版本有几种方法,推荐使用NVM(Node Version Manager),因为它可以让你轻松管理多个Node.js版本。 方法1: 使用NVM(推荐) 1. 安装NVM # 下载并安装NVM curl -o- https://raw.gi…...

养生新策:五维开启健康生活
一、饮食:天然食材,科学配比 以 “原型食物” 为主,减少加工食品摄入。早餐用鹰嘴豆泥涂抹全麦面包,搭配水煮蛋和一小把蓝莓,兼顾蛋白质与抗氧化物质;午餐选择藜麦饭,配上香煎鸡胸肉和蒜蓉空心…...
生成对抗网络(GAN)原理
生成对抗网络(GAN)原理 介绍示例代码一、GAN 的基本结构1. 生成器(Generator,记作 G)2. 判别器(Discriminator,记作 D) 二、对抗过程(博弈思想)三、训练过程四…...
【SpringBoot实战指南】使用 Spring Cache
文章目录 一、Spring Cache简介核心特点: 二、基础配置1. 添加依赖2. 启用缓存3. 缓存配置方案方案1:通过 yml 配置文件方案2:自定义 Bean 三、 缓存注解使用示例1.Cacheable - 数据查询缓存2.CachePut - 更新数据并缓存3.CacheEvict - 删除缓…...

centos8 配置网桥,并禁止kvm默认网桥
环境背景: 我使用vmware部署了一台kvm服务器,网络模式是nat。我想要kvm创建的虚拟机可以访问公网;所以kvm默认的地址不行,我必须使用nat地址才可以; 实现方式: 创建一个网桥,将本地的网络接口…...
C++:list容器,deque容器
list容器:双向链表容器,底层是双向链表。 简单使用如下: #include<iostream> #include<list> using namespace std;int main() {list<int> lst;lst.push_back(1);lst.push_back(2);lst.push_back(3);lst.push_front(4);l…...

【Node.js】全栈开发实践
个人主页:Guiat 归属专栏:node.js 文章目录 1. Node.js 全栈开发概述1.1 全栈开发的优势1.2 Node.js 全栈开发技术栈 2. 开发环境搭建2.1 Node.js 和 npm 安装2.2 开发工具安装2.3 版本控制设置2.4 项目初始化流程 3. 后端开发 (Node.js)3.1 Express 框架…...
自定义类型-联合体
概念 联合体是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型 联合体的所有成员共享同一块内存空间,大小由最大的成员决定 用于在同一块内存单元内存放不同类型的变量 语法结构 结构与结构体类似, union 共用体名 {成员列…...
Qt项目开发中所遇
讲述下面代码所表示的含义: QWidget widget_19 new QWidget(); QVBoxLayout *touchAreaLayout new QVBoxLayout(widget_19);QWidget *buttonArea new QWidget(widget_19); 1、新建一个名为widget_19的QWidget,将给其应用垂直管路布局。 2、新建一个…...

ubuntu sh安装包的安装方式
ubuntu sh安装包的安装方式以Miniconda2为例 https://repo.anaconda.com/miniconda/ 如果需要python2.7版本可下载以下版本 Miniconda2-latest-Linux-x86_64.sh 打开终端输入安装命令 sudo sh Miniconda2-latest-Linux-x86_64.sh 然后按提示安装,注意安装位置 …...
Redis语法大全
一、String(字符串) 特点:单键值存储,值可为字符串、数字,支持原子操作。 常用命令 SET 语法:SET key value [EX seconds] [PX milliseconds] [NX|XX]说明:设置键值对,可指定过期时…...

OpenAI宣布:核心API支持MCP,助力智能体开发
今天凌晨,OpenAI全资收购io的消息成为头条。同时,OpenAI还宣布其核心API——Responses API支持MCP服务。过去,开发智能体需通过函数调用与外部服务交互,过程复杂且延迟高。而今,Responses API支持MCP后,开发…...
我的爬虫夜未眠:一场与IP限流的攻防战
深夜的办公室里,键盘声此起彼伏,屏幕的蓝光映在程序员的脸上。我揉了揉酸胀的眼睛,第8次刷新日志页面——依旧是刺眼的“429 Too Many Requests”(请求过多)。这是本月第三次因为IP被目标网站封禁而被迫中断爬虫任务了…...
git:The following paths are ignored by one of your
遇到错误: The following paths are ignored by one of your .gitignore files: www hint: Use -f if you really want to add them. 说明:Git 拒绝添加 www/html/index.php,因为你的 .gitignore 中忽略了整个 www/ 目录(即 ww…...
算法--js--组合总和
题:给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。candidates 中的 同一个 数字可以 无限制重复…...