C++學習之STL學習:map/set

? ? ? ? 通過前面的學習,我們已經對C++ STL有了初步了解。然而,STL作為一個龐大復雜的體系,遠不止這些內容。接下來,我們將深入探討STL中的另外兩個重要組件——map和set。

? ? ? ? 作者的個人gitee:樓田莉子 (riko-lou-tian) - Gitee.com喜歡請點個贊謝謝

目錄

? ? ? ? 前言——序列式容器和關聯式容器

? ? ? ? set的介紹

set的接口介紹

? ? ? ? 構造函數和析構函數

? ? ? ? 構造函數

? ? ? ? 析構函數

? ? ? ? =運算符重載

? ? ? ? 迭代器

? ? ? ? 正向

? ? ? ? 反向

? ? ? ? 正向const

? ? ? ? 反向const

? ? ? ? 容量

? ? ? ? empty

? ? ? ? size

? ? ? ? max_size

? ? ? ? 相關函數

? ? ? ? insert

? ? ? ? erase

????????swap

? ? ? ? clear

????????emplace?

? ? ? ? emplace_hint

? ? ? ? 觀察者

? ? ? ? key_comp? ? ??編輯

? ? ? ? value_comp

? ? ? ? 操作

? ? ? ? find

? ? ? ? count

? ? ? ? lower_bound

? ? ? ? upper_bound

? ? ? ? equal_range

multiset和set的區別

set相關的習題

? ? ? ? 兩個數組的交集

? ? ? ? 環形鏈表

map的介紹

? ? ? ? pair結構介紹

map的接口介紹

? ? ? ? 構造和析構函數

? ? ? ? 構造函數

????????析構函數

? ? ? ? =運算符重載

? ? ? ? 迭代器

? ? ? ? 正向

? ? ? ? 反向

? ? ? ? const正向

? ? ? ? const反向

????????容量

? ? ? ? empty

? ? ? ? size

? ? ? ? max_size

????????訪問

????????[]運算符重載

????????at

????????相關函數

? ? ? ? insert

? ? ? ?erase

? ? ? ? swap

? ? ? ? clear?????????編輯

? ? ? ? emplace

? ? ? ? emplace_hint

????????觀察者

? ? ? ? key_comp

? ? ? ? value_comp

????????操作

? ? ? ? find

? ? ? ? count????????

? ? ? ? lower_bound

? ? ? ? upper_bound

? ? ? ? equal_range

multimap和map的區別

map相關的習題

? ? ? ? 隨機鏈表的復制

? ? ? ? 前k個高頻詞匯


? ? ? ? 前言——序列式容器和關聯式容器

? ? ? ?前?我們已經接觸過STL中的部分容器如:string、vector、list、deque、array、forward_list等,這些容器統稱為序列式容器,因為邏輯結構為線性序列的數據結構,兩個位置存儲的值之間?般沒有緊密的關聯關系,?如交換?下,他依舊是序列式容器。順序容器中的元素是按他們在容器中的存儲位置來順序保存和訪問的。
????????關聯式容器也是?來存儲數據的,與序列式容器不同的是,關聯式容器邏輯結構通常是?線性結構,兩個位置有緊密的關聯關系,交換?下,他的存儲結構就被破壞了。順序容器中的元素是按關鍵字來保存和訪問的。關聯式容器有map/set系列和unordered_map/unordered_set系列。
? ? ? ? 本篇中學習的map和set容器底層是紅?樹,紅?樹是?顆平衡?叉搜索樹。set是key搜索場景的結構, map是key/value搜索場景的結構

? ? ? ? set的介紹

? ? ? ? set和multiset的文檔:<set> - C++ Reference

? ? ? ? 在使用set和multiset的時候要包含頭文件<set>和

using namespace std;

? ? ? ? 進入set文檔我們會發現

? ? ? ? set不允許冗余,multiset允許冗余而不破壞結構

? ? ? ? set的官方文檔:set - C++ 參考

? ? ? ?set的介紹

? ? ? ? ? ?

????????set的聲明如下,T就是set底層關鍵字的類型

template < class T,             // set::key_type/value_type
class Compare = less<T>,         // set::key_compare/value_compare
class Alloc = allocator<T>     // set::allocator_type
> class set;

????????set默認要求T?持?于?較,如果不?持或者想按??的需求?可以??實現仿函數傳給第?個模版參數

????????set底層存儲數據的內存是從空間配置器申請的,如果需要可以??實現內存池,傳給第三個參數。

?????????般情況下,我們都不需要傳后兩個模版參數。

????????set底層是?紅?樹實現,增刪查效率是 ,迭代器遍歷是?的搜索樹的中序,所以是有序的。O(logN)

set的接口介紹

? ? ? ? 構造函數和析構函數

? ? ? ? 構造函數

? ? ? ? 析構函數

? ? ? ? =運算符重載

? ? ? ? 迭代器

? ? ? ? 正向

? ? ? ? 反向

? ? ? ? 正向const

? ? ? ? 反向const

? ? ? ? 容量

? ? ? ? empty

? ? ? ? size

? ? ? ? max_size

? ? ? ? 相關函數

? ? ? ? insert

? ? ? ? erase

????????swap

? ? ? ? clear

????????emplace?

? ? ? ? emplace_hint

? ? ? ? 觀察者

? ? ? ? key_comp? ? ?

? ? ? ? value_comp

??

? ? ? ? 操作

? ? ? ? find

????????

void test2()
{set<int>s = { 0,9,1,4,7,2,3,2,5,8,7,8,3,6,9 };s.insert(60);print(s);//set自己的find//時間復雜度O(log(n))auto it=s.find(60);if (it != s.end()){cout << "find 60 success" << endl;}else{cout << "find 60 failed" << endl;}//算法庫的find//時間復雜度O(N)auto ret = find(s.begin(), s.end(), 60);if (it != s.end()){cout << "find 60 success" << endl;}else{cout << "find 60 failed" << endl;}
}

? ? ? ? 算法庫也有find函數,但是算法庫的find效率比set的低下。

? ? ? ? 結果為:

? ? ? ? multiset中的find中序查找

? ? ? ? count

????????

void test3()
{set<int>s = { 0,9,1,4,7,2,3,2,5,8,7,8,3,6,9 };if (s.count(2)){cout << "存在" << " ";}else{cout << "不存在" << " ";}
}

結果為:

? ? ? ? count是為了和multiset區分,因為它有多個。

? ? ? ? lower_bound

????????

? ? ? ? upper_bound

????????

void test4()
{set<int>s = { 0,9,1,4,7,2,3,2,5,8,7,8,3,6,9,10,21,10,11,18,19 };//找到[3,9]區間的元素刪除//>=3auto it1 = s.lower_bound(3);//>3auto it2 = s.upper_bound(9);//打印區間[it1,it2]for (auto it = it1; it != it2; ++it){cout<<*it<<" ";}cout<<endl;//刪除區間[it1,it2]s.erase(it1,it2);print(s);/*for (auto it = it1; it != it2; it++){s.erase(it);}*////print(s);
}

結果為:

? ? ? ? equal_range

multiset和set的區別

????????multiset和set的使?基本完全類似,主要區別點在于multiset?持值冗余,那么insert/find/count/erase都圍繞著?持值冗余有所差異,具體參看下?的樣例代碼理解。

void test5()
{// 相?set不同的是,multiset是排序,但是不去重multiset<int> 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;
}

? ? ? ? 結果為:

set相關的習題

? ? ? ? 兩個數組的交集

????????

? ? ? ? 老方法:

? ? ? ? 先使用快慢指針判斷是否有環,隨后找到環的入口點

? ? ? ? 新方法:

????????遍歷鏈表,判斷是否在s中,不再就插入,在的第一個就是入口點,如果都不在,就插入了鏈表結束了都帶環,比較兩個set,小的++;相等就是交集,同時++。一個遍歷就結束了

class Solution {
public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {//老方法:太麻煩了//是否帶環(雙指針)//找環的入口點    //新方法:set<Node*>s;//遍歷鏈表,判斷是否在s中//不再就插入,在的第一個就是入口點//如果都不在,就插入了鏈表結束了都帶環set<int> s1(nums1.begin(), nums1.end());set<int> s2(nums2.begin(), nums2.end());//// 因為set遍歷是有序的,有序值,依次比較//比較//小的++;相等就是交集,同時++。一個練筆就結束了vector<int> ret;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{ret.push_back(*it1);it1++;it2++;}} return ret;}
};

? ? ? ? 該算法找差集也很合適

? ? ? ? 1、小的就是差集。小的++

? ? ? ? 2、相等,同時++

? ? ? ? 3、一個遍歷結束剩下的就是差集

? ? ? ? 環形鏈表

????????

????????

/*** 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) {set<ListNode*> s;ListNode* cur = head;while(cur){auto ret = s.insert(cur);if(ret.second == false)return cur;cur = cur->next;} return nullptr;}
};

map的介紹

? ? ? ? map和multimap的官方文檔:<地圖> - C++參考

? ? ? ? map的介紹

????????map的聲明如下,Key就是map底層關鍵字的類型,T是map底層value的類型,set默認要求Key?持?于?較,如果不?持或者需要的話可以??實現仿函數傳給第?個模版參數,map底層存儲數據的內存是從空間配置器申請的。?般情況下,我們都不需要傳后兩個模版參數。map底層是?紅?樹實現,增刪查改效率是 O(logN) ,迭代器遍歷是?的中序,所以是按key有序順序遍歷的

template < class Key,                         // map::key_type
class T,                                     // map::mapped_type
class Compare = less<Key>,                  // map::key_compare
class Alloc = allocator<pair<const Key,T> >//map::allocator_type
> class map;

? ? ? ? pair結構介紹

????????map底層的紅?樹節點中的數據,使?pair<Key, T>存儲鍵值對數據。
? ? ? ? pair的官方文檔:pair - C++ 參考

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));
}

map的接口介紹

? ? ? ? 構造和析構函數

? ? ? ? 構造函數

????????

????????析構函數

? ? ? ? =運算符重載

? ? ? ? 迭代器

? ? ? ? 正向

? ? ? ? 反向

? ? ? ? const正向

? ? ? ? const反向

????????容量

? ? ? ? empty

????????

? ? ? ? size

????????

? ? ? ? max_size

????????

????????訪問

????????[]運算符重載

? ? ? ? key在map中就插入;如果不在就查找并修改

????????at

????????相關函數

? ? ? ? insert

????????

? ? ? ?erase

? ? ? ? swap

????????

? ? ? ? clear
????????

? ? ? ? emplace

????????

? ? ? ? emplace_hint

? ? ? ? 測試:?

void test1()
{//比較麻煩的構造方式/*pair<string, string>kv1 = {"sort","排序"};pair<string, string>kv2 = { "left","左" };pair<string, string>kv3 = { "right","右" };pair<string, string>kv4 = { "up","上" };pair<string, string>kv5 = { "down","下" };map<string, string> dirt = {kv1, kv2, kv3, kv4, kv5};*///簡化的構造方式map<string, string> dirt = { {"sort","排序"}, {"left","左"}, {"right","右"}, {"up","上"}, {"down","下"} };pair<string, string>kv1 = { "sort","排序" };//dirt.insert(kv1);//make_pair()函數來源于pair文檔//make_pair()可以自動推導參數類型,不用模板參數dirt.insert(pair<string, string>{ "sort", "排序" });dirt.insert(make_pair("const","常量屬性"));//insert()函數可以自動推導參數類型,不用模板參數//隱式類型轉換//推薦這種寫法dirt.insert({ "volatile","易變性" });//遍歷dirt//map<string,string>::iterator it=dirt.begin();auto it = dirt.begin();while (it!= dirt.end()){//pair沒有流重載所以不能寫*it//可以這樣寫cout<<(*it).first<<" : "<<(*it).second<<endl;//更推薦這種寫法cout << it->first << " : " << it->second << " ";//相當于//cout << it.operator->()->first << " : " << it.operator->()->second << " ";it++;}cout << endl;//范圍forfor (auto& kv : dirt){cout << kv.first << " : " << kv.second << endl;}//使用auto&的原因//避免拷貝開銷:/*dirt的元素類型是pair<const string, string>每個pair包含兩個string對象,每個string可能包含動態分配的堆內存使用引用auto& 直接訪問容器內元素,不創建任何副本*/// 內存布局對比:// 容器內元素: [pair1] -> [key_str_data][val_str_data]//              [pair2] -> [key_str_data][val_str_data]// 使用auto&: kv 直接指向容器內元素的內存// 使用auto:   kv 是完整的拷貝(包括所有字符串數據)/*	特性			auto& kv			auto kv拷貝開銷	無拷貝(零開銷)		每個元素兩次深拷貝內存占用	僅指針大小(約8字節)	每個元素兩份完整字符串動態內存	不分配新內存			每次迭代分配新內存修改原容器	可修改value				修改無效(副本)循環速度	?? 極快	🐢				極慢(尤其大字符串)推薦指數	★★★★★				★☆☆☆☆(禁止使用)*///更推薦C++17的結構化綁定//auto& [x, y] = kv1;for (auto& [x, y] : dirt){cout<<"x="<<x<<" y="<<y<<" ";}cout<<endl;
}

????????觀察者

? ? ? ? key_comp

????????

? ? ? ? value_comp

????????操作

? ? ? ? find

????????

? ? ? ? count????????

????????

? ? ? ? lower_bound

????????

? ? ? ? upper_bound

????????

? ? ? ? equal_range

? ? ? ? 找與key相等的區間[x,y)。

? ? ? ? 主要適合于multimap

multimap和map的區別

????????multimap和map的使?基本完全類似,主要區別點在于multimap?持關鍵值key冗余,那么insert/find/count/erase都圍繞著?持關鍵值key冗余有所差異,這?跟set和multiset完全?樣,?如find時,有多個key,返回中序第?個。其次就是multimap不?持[],因為?持key冗余,[]就只能?持插?了,不能?持修改。

map相關的習題

? ? ? ? 隨機鏈表的復制

????????

思路:拷貝節點在原節點后面

? ? ? ? 關鍵的地方在于:copy->random=cur->random->next

? ? ? ? 步驟:? ? ? ?

????????1、拷貝節點插在原節點后面

? ? ? ? 2、原節點random控制新節點的random

? ? ? ? 3、將新節點解下來鏈接到上面

/*
// 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) {map<Node*, Node*> nodeMap;Node* copyhead = nullptr,*copytail = nullptr;Node* cur = head;while(cur){if(copytail == nullptr){copyhead = copytail = new Node(cur->val);} else{copytail->next = new Node(cur->val);copytail = copytail->next;} // 原節點和拷?節點map kv存儲nodeMap[cur] = copytail;cur = cur->next;} // 處理randomcur = 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;}
};

? ? ? ? 前k個高頻詞匯

????????

????????

class Solution
{
public://老方法:stable_sort函數(穩定排序)// 仿函數// struct compare// {//     bool operator()(const pair<string ,int>&kv1,const pair<string ,int>&kv2)//     {//         return kv1.second>kv2.second;//     }// };// vector<string> topKFrequent(vector<string>& words, int k) // {//     map<string ,int>countMap;//     for(auto& str:words)//     {//         //統計次數//         countMap[str]++;//     }//     //數據量很大的時候要建小堆//     //數據量不大用大堆//     //但是這里要按頻率所以不建議用小堆//     //用排序和大堆都差不多//     //不可以用sort直接去排序//     //sort要求是隨機迭代器,只用string、vector、deque支持//     vector<pair<string,int>>v(countMap.begin(),countMap.end());//     //sort(v.begin(),v.end(),compare());//     //sort不是一個穩定的排序//     stable_sort(v.begin(),v.end(),compare());//穩定的排序算法//     vector<string>ret;//     //取出k個//     for(int i=0;i<k;i++)//     {//         ret.push_back(v[i].first);//     }//     return ret;//方法二:仿函數//仿函數// struct compare// {//     bool operator()(const pair<string ,int>&kv1,const pair<string ,int>&kv2)//     {//         return kv1.second>kv2.second||(kv1.second==kv2.second&&kv1.first<kv2.first);//     }// };// vector<string> topKFrequent(vector<string>& words, int k) // {//     map<string ,int>countMap;//     for(auto& str:words)//     {//         //統計次數//         countMap[str]++;//     }//     //數據量很大的時候要建小堆//     //數據量不大用大堆//     //但是這里要按頻率所以不建議用小堆//     //用排序和大堆都差不多//     //不可以用sort直接去排序//     //sort要求是隨機迭代器,只用string、vector、deque支持//     vector<pair<string,int>>v(countMap.begin(),countMap.end());//     //仿函數可以控制比較邏輯//     sort(v.begin(),v.end(),compare());//穩定的排序算法//     vector<string>ret;//     //取出k個//     for(int i=0;i<k;i++)//     {//         ret.push_back(v[i].first);//     }//     return ret;//方法三:優先級隊列struct compare{bool operator()(const pair<string, int>& kv1, const pair<string, int>& kv2) const{// 比較邏輯:頻率高優先,頻率相同則字典序小優先return kv1.second < kv2.second ||(kv1.second == kv2.second && kv1.first > kv2.first);}};vector<string> topKFrequent(vector<string>& words, int k){map<string, int> countMap;for (auto& str : words){countMap[str]++;}//數據量很大的時候要建小堆//數據量不大用大堆//但是這里要按頻率所以不建議用小堆//用排序和大堆都差不多//不可以用sort直接去排序//sort要求是隨機迭代器,只用string、vector、deque支持//建立大堆//priority_queue默認為大堆//不寫仿函數的時候priority_queue按pair比,pair默認按小于比priority_queue<pair<string, int>,           // - 元素類型: pair<string, int>vector<pair<string, int>>,  // - 容器類型: vector<pair<string, int>>compare>                   // - 比較器類型: compare (去掉括號)pq(countMap.begin(), countMap.end());vector<string> ret;for (int i = 0; i < k; i++){ret.push_back(pq.top().first);pq.pop();}return ret;}
};

? ? ? ? 本期內容就到這里了,喜歡請點個贊謝謝。

封面圖自取:

? ? ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/92578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/92578.shtml
英文地址,請注明出處:http://en.pswp.cn/web/92578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

[學習] CORDIC算法詳解:從數學原理到反正切計算實戰

CORDIC算法詳解&#xff1a;從數學原理到反正切計算實戰 文章目錄CORDIC算法詳解&#xff1a;從數學原理到反正切計算實戰引言一、數學原理二、求解流程&#xff08;旋轉模式&#xff09;三、典型應用場景四、反正切計算示例&#xff08;Python實現&#xff09;五、算法流程可視…

3款強力的Windows系統軟件卸載工具

1、Geek 下載地址&#xff1a;https://download.csdn.net/download/weixin_42203093/91625765 Geek Uninstaller 是一款專業的 Windows 軟件卸載工具&#xff0c;主要用于卸載軟件并清理殘留垃圾&#xff1a; 特點 體積小巧便攜&#xff1a;軟件體積約為 1.7M&#xff0c;是單…

AcWing 4579. 相遇問題

這道題做個今天的結尾 比較簡單 正在備戰csp嗎&#xff0c;正好刷一下 難度&#xff1a;簡單時/空限制&#xff1a;1s / 256MB總通過數&#xff1a;1738總嘗試數&#xff1a;2584來源&#xff1a; CSP-J 2022 模擬賽 原題鏈接 4579. 相遇問題 - AcWing題庫 題目描述 一…

基于clodop和Chrome原生打印的標簽實現方法與性能對比

今天想看看&#xff0c;基于clodop和Chrome原生打印的標簽實現方法與性能對比。先看看DeepSeek關于這個問題的回答&#xff01; CloudPrint 和 Chrome 原生打印的區別 基本概念差異 CloudPrint (Clodop) 是基于云的打印服務解決方案需要安裝專門的客戶端程序支持跨平臺、跨設備…

百度網盤如何做到下載速度最快?OpenSpeedy綠色安裝版下載,開源免費網盤加速

下載地址獲取點擊這里打開&#xff1a;OpenSpeedy下載地址 打開解壓后的文件夾&#xff0c;找到【OpenSpeedy.exe】應用程序&#xff0c;右鍵選擇【以管理員身份運行】。 添加圖片注釋&#xff0c;不超過 140 字&#xff08;可選&#xff09; 主要特性&#xff1a; 免費開源蠻…

科技云報到:熱鏈路革命:阿卡 CRM 的 GTM 定位突圍

科技云報道原創。在企業數字化的工具箱里&#xff0c;“CRM” 一詞早已不是 “全流程客戶管理” 的代名詞&#xff0c;而是從營銷獲客到客戶信息沉淀&#xff0c;再到長期關系維護&#xff0c;仿佛要包攬從線索到復購的所有環節。但成立僅兩年半的阿卡 CRM&#xff0c;卻在實踐…

什么是Graphical Abstract

什么是Graphical Abstract 現在都需要用Graphical Abstract&#xff0c;新加的好像。圖形摘要&#xff08;Graphical Abstract&#xff09;是學術論文中一種以可視化方式濃縮呈現研究核心內容的圖表&#xff0c;它通過簡潔的圖形、流程圖、示意圖或組合視覺元素&#xff0c;直觀…

心靈筆記:正念冥想

定義&#xff1a;正念冥想&#xff08;Mindfulness Meditation&#xff09;是一種源自東方禪修、結合現代心理學的心理訓練方法&#xff0c;核心是有意識地將注意力集中在當下的體驗上&#xff0c;不加評判地覺察自身的 thoughts&#xff08;想法&#xff09;、feelings&#x…

微軟推出革命性AI安全工具Project IRE,重塑網絡安全防御新范式

面對日益復雜的網絡安全威脅&#xff0c;微軟近日發布了具有里程碑意義的Project IRE AI工具。這項創新性解決方案將人工智能與逆向工程技術深度融合&#xff0c;開創了自動化威脅檢測的新紀元。據微軟官方披露&#xff0c;該工具能夠在不依賴人工干預的情況下&#xff0c;自主…

C#Attribute(特性)的定義與使用

1.什么是 Attribute1.1 定義 Attribute 是一種“聲明式元數據&#xff08;declarative metadata&#xff09;”機制。 ? 附加位置&#xff1a;程序集、模塊、類型、字段、屬性、方法、方法參數、方法返回值、事件、泛型參數、局部變量、本地函數、Lambda 表達式、甚至表達式樹…

飛書對接E簽寶完整方案

1、概述飛書和E簽寶在各自領域都屬于領先的產品&#xff0c;但因為E簽寶與釘釘的特殊關系&#xff0c;一直以來E簽寶都只實現了與釘釘的深度集成&#xff0c;一家企業如果想同時使用飛書和E簽寶&#xff0c;則需要通過S-HUB這樣的產品來進行橋接&#xff0c;用戶在飛書端審批&a…

Mysql快速導出數據庫設計說明書word文檔(表結構、類型、注釋、是否有主鍵)

主要有三種方式&#xff0c;根據你的需求來選擇&#xff1a; 1、Mysql語句查詢 優點&#xff1a;無需安裝額外的軟件&#xff0c;使用你常用的數據庫可視化工具即可 缺點&#xff1a;受限于你的數據庫可視化工具的導出功能&#xff0c;需要額外寫腳本進行處理 2、Python腳本…

DigitalProductId解密算法php調試版piddebug.php

<?php // 使用數組字面量 $digits [B, C, D, F, G, H, J, K, M, P, Q, R,T, V, W, X, Y, 2, 3, 4, 6, 7, 8, 9]; //foreach ($digits as $digit) { // echo $digit."<br>"; //}$hexPidarray(0xc2,0x49,0x4b,0xcc,0x60,0x34,0x09,0xcd,0x96,0xf7,0xec,0…

IDEA快捷鍵壁紙分享

說明&#xff08;1&#xff09;因為顯示器的尺寸不同&#xff0c;對快捷鍵顯示的位置稍作調整 &#xff08;2&#xff09;這里默認您熟悉常用的快捷鍵&#xff0c;分享一些功能好用但是用的少的快捷鍵空壁紙筆記本壁紙&#xff08;15.6寸&#xff09;24 寸顯示器壁紙

InnoDB vs MyISAM: MySQL存儲引擎的世紀對決

選錯存儲引擎&#xff1f;你的數據庫性能可能暴跌80%&#xff01; 本文用最直觀的對比拆解MySQL兩大核心存儲引擎的差異&#xff0c;讓你徹底明白什么場景該選誰。一、引擎全景圖: 數據庫的"心臟"之爭 ?? #mermaid-svg-KTQko8kEUvOkTb4L {font-family:"trebuc…

【Avalonia】無開發者賬號使用iOS真機調試跨平臺應用

文章目錄1. 要求1.1 無需Apple開發者賬號1.2 最新版mac系統1.3 最新版Xcode2. 配對Mac3. 配置開發證書3.1 創建一個名為MTClient的Xcode項目3.2 找到簽名證書3.3 配置簽名3.4 配置標識符4. 真機調試4.1 設置應用首屏 Launch Screen4.2 設置應用圖標5. 問題5.1 DI異常該問題的解…

【LLM實戰|langchain】langchain基礎

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 【LLM實戰|langchain】langchain基礎 1. 模型 I/O 封裝 把不同的模型&#xff0c;統一封裝成一個接口&#xff0c;方便更換模型而不用重構代碼。 1.1 …

十九、MySQL-DQL-基本查詢

基本查詢代碼&#xff1a;DQL:基本查詢 1.查詢指定字段 name,entrydate 并返回 -- 1.查詢指定字段 name,entrydate 并返回 select name,entrydate from tb_emp;2.查詢返回所有字段 -- 2.查詢返回所有字段 -- 推薦 select id, username, password, name, gender, image, job, e…

CamX-驍龍相機修改

1. 修改視頻模式預覽尺寸和分辨率 vendor/codeaurora/packages/apps/SnapdragonCamera/src/com/android/camera/CaptureModule.javaprivate void updatePreviewSize() {int width mPreviewSize.getWidth();int height mPreviewSize.getHeight(); - mPreviewSize new …

容器技術基礎與實踐:從鏡像管理到自動運行配置全攻略

1. 相比較虛擬機&#xff0c;容器有哪些技術優勢&#xff1f;&#xff08;1&#xff09;直接在操作系統上運行&#xff0c;從而跨系統上的所有容器共享資源&#xff0c;‘&#xff08;2&#xff09;共享主機的內核。&#xff08;3&#xff09;與虛擬機相比&#xff0c;它需要的…