【C++】map和set的使用 - 指南

news/2025/11/1 15:24:40/文章来源:https://www.cnblogs.com/yangykaifa/p/19183410

1. 序列式容器和关联式容器

前⾯我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这 些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间⼀般没有紧 密的关联关系,比如交换一下,他依旧是序列式容器。顺序容器中的元素是按他们在容器中的存储位置来顺序保存和访问的。 关联式容器也是用来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是非线性结构, 两个位置有紧密的关联关系,交换⼀下,他的存储结构就被破坏了。顺序容器中的元素是按关键字来保存和访问的。关联式容器有map/set系列和unordered_map/unordered_set系列。本章节讲解的map和set底层是红黑树,红黑树是一颗平衡二叉搜索树。set是key搜索场景的结构, map是key/value搜索场景的结构。

2. set系列的使用

2.1set参考文档

https://legacy.cplusplus.com/reference/set/set/?kw=set

2.2 set类的介绍

  • set的声明如下,T就是set底层关键字的类型
  • set默认要求T支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模版参数
  • set底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参 数。
  • ⼀般情况下,我们都不需要传后两个模版参数。
  • set底层是用红黑树实现,增删查效率是 ,迭代器遍历是走的搜索树的中序,所以是有序的。 O(logN)
  • 前⾯部分我们已经学习了vector/list等容器的使用,STL容器接口设计,高度相似,所以这里我们就不再⼀个接口⼀个接口的介绍,而是直接带着大家看文档,挑比较重要的接口进行介绍。

2.3 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 
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 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 set的增删查

Member types
key_type -> The first template parameter (T)
value_type -> The first template parameter (T)
// 单个数据插⼊,如果已经存在则插⼊失败
pair insert (const value_type& val);
// 列表插⼊,已经在容器中存在的值不会插⼊
void insert (initializer_list il);
// 迭代器区间插⼊,已经在容器中存在的值不会插⼊
template 
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;

2.5 insert和迭代器遍历使用样例

#include
#include
using namespace std;
int main()
{// 去重+升序排序set s;// 去重+降序排序(给⼀个⼤于的仿函数)//set> s;s.insert(5);s.insert(2);s.insert(7);s.insert(5);//set::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 strset = { "sort", "insert", "add" };// 遍历string⽐较ascll码⼤⼩顺序遍历的for (auto& e : strset){cout << e << " ";}cout << endl;
}

2.6 find和erase使用样例

#include
#include
using namespace std;
int main()
{set 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;}return 0;
}
#include
#include
using namespace std;
int main()
{std::set myset;for (int i = 1; i < 10; i++)myset.insert(i * 10); // 10 20 30 40 50 60 70 80 90for (auto e : myset){cout << e << " ";}cout << endl;// 实现查找到的[itlow,itup)包含[30, 60]区间// 返回 >= 30auto itlow = myset.lower_bound(30);// 返回 > 60auto itup = myset.upper_bound(60);// 删除这段区间的值myset.erase(itlow, itup);for (auto e : myset){cout << e << " ";}cout << endl;return 0;
}

2.7 multiset和set的差异

multiset帮助文档

multiset和set的使用基本完全类似,主要区别点在于multiset支持值冗余,那么 insert/find/count/erase都围绕着支持值冗余有所差异,具体参看下面的样例代码理解。        

#include
#include
using namespace std;
int main()
{// 相⽐set不同的是,multiset是排序,但是不去重multiset s = { 4,2,7,2,4,8,4,5,4,9 };auto it = s.begin();while (it != s.end()){cout << *it << " ";++it;}cout << endl;// 相⽐set不同的是,x可能会存在多个,find查找中序的第⼀个int x;cin >> x;auto pos = s.find(x);while (pos != s.end() && *pos == x){cout << *pos << " ";++pos;}cout << endl;// 相⽐set不同的是,count会返回x的实际个数cout << s.count(x) << endl;// 相⽐set不同的是,erase给值时会删除所有的xs.erase(x);for (auto e : s){cout << e << " ";}cout << endl;return 0;
}

2.8 两个数组的交集

class Solution {
public:vector intersection(vector& nums1, vector& nums2) {vectorv;sets1(nums1.begin(),nums1.end());sets2(nums2.begin(),nums2.end());auto it1 = s1.begin();auto it2 = s2.begin();while(it1 != s1.end() && it2!=s2.end()){if(*it1<*it2){it1++;}else if(*it1>*it2){it2++;}else{v.push_back(*it1);it1++;it2++;}}return v;}
};

2.9 环形链表 II

数据结构初阶阶段,我们通过证明⼀个指针从头开始走⼀个指针从相遇点开始走,会在入口点相遇, 理解证明都会很麻烦。这里我们使用set查找记录解决非常简单方便,这里体现了set在解决⼀些问题时的价值,完全是降维打击。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {sets;ListNode*cur = head;while(cur){auto it = s.insert(cur);if(it.second == false){return cur;}cur = cur->next;}return nullptr;}
};

3. map系列的使用

3.1 map的参考文档

https://legacy.cplusplus.com/reference/map/map/?kw=map

3.2 map类的介绍

map的声明如下,Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key支持小于比较,如果不支持或者需要的话可以自行实现仿函数传给第二个模版参数,map底层存储数据的内存是从空间配置器申请的。一般情况下,我们都不需要传后两个模版参数。map底层是用红黑树实现,增删查改效率是O(logN) ,迭代器遍历是走的中序,所以是按key有序顺序遍历的。

3.3 pair类型介绍

map底层的红黑树节点中的数据,使用pair存储键值对数据

pair帮助文档

typedef pair value_type;
template 
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){}templatepair(const pair& pr) : first(pr.first), second(pr.second){}
};
template 
inline pair make_pair(T1 x, T2 y)
{return (pair(x, y));
}

3.4 map的构造

map支持正向和反向迭代遍历,遍历默认按key的升序顺序,因为底层是二叉搜索树,迭代器遍历走的中序;支持迭代器就意味着支持范围for,map支持修改value数据,不支持修改key数据,修改关键字数据,破坏了底层搜索树的结构。

// empty (1) ⽆参默认构造
explicit map(const key_compare& comp = key_compare(),const allocator_type& alloc = allocator_type());
// range (2) 迭代器区间构造
template 
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 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();

例:

pairkv1("sort","排序");
pairkv2("left","左边");
pairkv3("right","右边");
pairkv4 = { "insert","插入" };
mapdict1 = {kv1,kv2,kv3};
mapdict2 = { {"sort","排序" }, { "left","左边" }, { "right","右边" } };

3.5 map的增删查

map增接口,插入的pair键值对数据,跟set所有不同,但是查和删的接口只用关键字key跟set是完全类似的,不过find返回iterator,不仅仅可以确认key在不在,还找到key映射的value,同时通过迭代还可以修改value

// 单个数据插⼊,如果已经key存在则插⼊失败,key存在相等value不相等也会插⼊失败
pair insert(const value_type& val);
// 列表插⼊,已经在容器中存在的值不会插⼊
void insert(initializer_list il);
// 迭代器区间插⼊,已经在容器中存在的值不会插⼊
template 
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;

例:

	// insert插⼊pair对象的4种⽅式,对⽐之下,最后⼀种最⽅便pair kv1("first", "第⼀个");dict.insert(kv1);dict.insert(pair("second", "第⼆个"));dict.insert(make_pair("sort", "排序"));dict.insert({ "auto", "⾃动的" });//"left"已经存在,插⼊失败dict.insert({ "left", "左边,剩余" });dict.insert({ "left", "*****" });//插入失败dict.insert({ "Left", "左边" });//插入成功 map的插入只看keyauto it = dict.find("first");//查找dict.erase(it);//删除dict.erase("second");//删除

3.6 map的数据修改

前面我提到map支持修改mapped_type数据,不支持修改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
// 查找k,返回k所在的迭代器,没有找到返回end(),如果找到了通过iterator可以修改key对应的
mapped_type值
iterator find(const key_type& k);
// insert插⼊⼀个pair对象
// 1、如果key已经在map中,插⼊失败,则返回⼀个pair对象,返回pair对象
first是key所在结点的迭代器,second是false
// 2、如果key不在在map中,插⼊成功,则返回⼀个pair对象,返回pair对象
first是新插⼊key所在结点的迭代器,second是true
// 也就是说⽆论插⼊成功还是失败,返回pair对象的first都会指向key所在的迭
代器
// 那么也就意味着insert插⼊失败时充当了查找的功能,正是因为这⼀点,insert可以⽤来实现
operator[]
// 需要注意的是这⾥有两个pair,不要混淆了,⼀个是map底层红⿊树节点中存的pair,另
⼀个是insert返回值pair
pair 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 ret = insert({ k, mapped_type() });iterator it = ret.first;return it->second;
}
	pair kv1("first", "第⼀个");dict.insert(kv1);auto it = dict.find("first");//查找it->second = "第一";

3.7 构造遍历使用样例

#include
#include
using namespace std;
int main()
{// initializer_list构造及迭代遍历map dict = { {"left", "左边"}, {"right", "右边"},{"insert", "插⼊"},{ "string", "字符串" } };//map::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;pair kv1("first", "第⼀个");dict.insert(kv1);dict.insert(pair("second", "第⼆个"));dict.insert(make_pair("sort", "排序"));dict.insert({ "auto", "⾃动的" });// 范围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;}}// erase等接⼝跟set完全类似,这⾥就不演⽰讲解了return 0;
}

3.8 map的迭代器和[ ]功能样例

#include
#include
#include
using namespace std;
int main()
{// 利⽤find和iterator修改功能,统计⽔果出现的次数string arr[] = { "苹果", "西⽠", "苹果", "西⽠", "苹果", "苹果", "西⽠","苹果", "⾹蕉", "苹果", "⾹蕉" };map 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;return 0;
}
#include
#include
#include
using namespace std;
int main()
{// 利⽤[]插⼊+修改功能,巧妙实现统计⽔果出现的次数string arr[] = { "苹果", "西⽠", "苹果", "西⽠", "苹果", "苹果", "西⽠","苹果", "⾹蕉", "苹果", "⾹蕉" };map 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;return 0;
}
#include
#include
#include
using namespace std;
int main()
{map dict;dict.insert(make_pair("sort", "排序"));// key不存在->插⼊ {"insert", string()}dict["insert"];// 插⼊+修改dict["left"] = "左边";// 修改dict["left"] = "左边、剩余";// key存在->查找cout << dict["left"] << endl;return 0;
}

3.9 multimap和map的差异

multimap和map的使用基本完全类似,主要区别点在于multimap支持关键值key冗余,那么 insert/find/count/erase都围绕着支持关键值key冗余有所差异,这里跟set和multiset完全⼀样,比如find时,有多个key,返回中序第⼀个。其次就是multimap不支持[ ],因为支持key冗余,[ ]就只能支持插入了,不能支修改。

3.10 随机链表的复制

数据结构初阶阶段,为了控制随机指针,我们将拷贝结点链接在原节点的后面解决,后面拷贝节点还得解下来链接,非常麻烦。这里我们直接让 { 原结点,拷贝结点 } 建立映射关系放到map中,控制随机指针会非常简单方便,这里体现了map在解决⼀些问题时的价值

/*
// Definition for a Node.
class Node {
public:int val;Node* next;Node* random;Node(int _val) {val = _val;next = NULL;random = NULL;}
};
*/
class Solution {
public:Node* copyRandomList(Node* head) {Node*copyhead = nullptr;Node*copytail = nullptr;mapnodemap;Node* cur = head;while(cur){if(copyhead==nullptr){copyhead = copytail = new Node(cur->val);}else{copytail -> next = new Node(cur->val);copytail = copytail->next;}nodemap[cur] = copytail;cur = cur->next;}cur = head;Node* copy = copyhead;while(cur){if(cur->random==nullptr){copy->random = nullptr;}else{copy->random = nodemap[cur->random];}cur = cur->next;copy = copy->next;}return copyhead;}
};

3.11 前K个高频单词

⽤排序找前k个单词,因为map中已经对key单词排序过,也就意味着遍历map时,次数相同的单词, 字典序小的在前面,字典序大的在后面。那么我们将数据放到vector中用一个稳定的排序就可以实现上面特殊要求,但是sort底层是快排,是不稳定的,所以我们要用stable_sort,他是稳定的。

class Solution {
public:struct Compare{bool operator()(const pair&x,const pair&y)const{return  x.second>y.second||(x.second==y.second&&x.first topKFrequent(vector& words, int k) {mapm;for(auto& e:words){m[e]++;}vector>v(m.begin(),m.end());sort(v.begin(), v.end(), Compare());vectorres;for(int i =0;i

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/952855.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Web安全】转义字符注入?转义也会失效的SQL注入 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

isulad容器使用教程

iSulad是一个由C/C++编写实现的轻量级容器引擎,具有轻、灵、巧、快的特点,不受硬件规格和架构限制,底噪开销更小,可应用的领域更为广泛。 安装isulad:yum install -y iSulad成功安装iSulad之后,需要先配置好容器镜…

完整教程:基于类的四种设计模式

完整教程:基于类的四种设计模式pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&qu…

Go基础:正则表达式 regexp 库详解 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

JBoltAI 智能企业内训平台深度解析

企业内训智能化转型新标杆:JBoltAI 智能企业内训平台 在数字化转型浪潮下,企业培训模式正经历着从传统线下授课到全流程智能化的颠覆性变革。JBoltAI 智能企业内训平台作为企业培训领域的创新解决方案,凭借其 AI 驱…

2025 年 11 月云南财务服务,云南财税咨询,昆明代理记账公司最新推荐,技术实力与市场口碑深度解析!

2025 年 11 月,省税务师协会联合省数字财税发展研究院,针对全省 92 家开展云南财务服务、云南财税咨询、昆明代理记账业务的机构,开展以 “技术硬实力 + 市场好口碑” 为核心的专项测评。本次测评采用 “量化考核 +…

第四十五章 ESP32S3 Flash 模拟 U 盘实验 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

JBoltAI框架揭秘:如何为Java应用注入“企业级AI知识库”能力

JBoltAI框架揭秘:如何为Java应用注入“企业级AI知识库”能力在企业级AI应用中,RAG(检索增强生成)是实现智能问答、决策辅助等场景的核心技术。而其根基,在于一个高效、可控的AI知识库。今天,我们将深入介绍JBolt…

2025 年 11 月云南财税服务,昆明财税代理,云南代理记账公司最新推荐,实力品牌深度解析采购无忧之选!

2025 年 11 月,省注册会计师协会联合省中小企业财税服务联盟,针对全省 87 家开展云南财税服务、昆明财税代理、云南代理记账业务的机构,开展 “实力品牌专项测评”。本次测评采用 “三维度权重评估法”:品牌资质维…

电脑恢复技巧:适用于 Windows 的 9 款最佳分区恢复软件

磁盘分区对于妥善存储数据、方便快捷地从硬盘访问数据至关重要。然而,如果分区损坏,其中存储的所有数据将突然无法访问。磁盘分区损坏的原因有很多,其中最常见的包括病毒攻击、突然断电、物理损坏或坏扇区的产生。 …

2025 年 11 月云南环保咨询,云南环评手续咨询,云南环评批复咨询最新推荐:聚焦资质、案例、售后的五家机构深度解读!

为解决云南企业在环评服务选型中 “资质真伪难辨、案例适配性不明、售后保障缺失” 的核心痛点,云南省环境保护产业协会联合省环境工程评估中心开展 2025 年度专项测评,覆盖全省 268 家咨询机构,最终筛选出 5 家在资…

20251031周五日记

20251031周五日记今日: 1.起的贼早,去实验室看会儿文章去和祥吃必胜客炉石联动。被上了一课,以后要更明确地懂别人的隐藏动作意思呀。陪他买个蛋糕回去上课了。 2.回去先把东西放回宿舍,把杜的信寄走。去听汇报和课…

完整教程:毕设项目基于Django的医药管理系统\251006(白嫖源码+演示录像)可做计算机毕设JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、文案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CSP-J 2025 题解

第一题:拼数 (number) 思路分析 题目要求使用一个字符串中包含的数字字符拼成一个最大的正整数。 要组成最大的数,我们的策略应该是把越大的数字放在越高的位(即越靠前的位置)。例如,用数字 \(9, 2, 1, 0, 0\) 能…

人工智能之编程基础 Python 入门:第五章 基本数据类型(一)

人工智能之编程基础 Python 入门:第五章 基本数据类型(一)人工智能之编程基础 Python 入门 第五章 基础数据类型(一)@目录人工智能之编程基础 Python 入门前言Number(数字)1. 整数 (int)特点:示例:2. 浮点数 …

150行的推箱子游戏

150行的推箱子游戏#include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <ncurses.h> #include <algorithm> t…

嵌入式制作笔记(1)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

tmp2

3、复杂模型机累加指令 ;/*** Start Of Main Memory Data ****/ $P 00 20 ;START: IN R0,00H 从IN单元读入计数初值 $P 01 00 $P 02 61 ;LDI R1,0FH $P 03 0F ;立即数0FH送R1 $P 04 14 ;AND R0,R1 得到R0低…

中国移动获得手机直连卫星通讯牌照:行业变革的催化剂 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年 11 月抗衰老精华液,修护精华液,保湿精华液 OEM/ODM 加工厂最新推荐,聚焦高端定制需求与全案交付能力!

据国际高端美妆供应链协会 2025 年 10 月发布的《功效型精华代加工定制服务报告》显示,抗衰老、修护、保湿类精华高端定制 OEM/ODM 需求同比增长 61%,但 45% 的品牌方反馈合作工厂存在 “定制方案单一、全案交付断层…