C++ map和set的使用

目錄

0.前言

1.關聯式容器

2.鍵值對

3.樹形結構的關聯式容器

3.1樹形結構的特點

3.2樹形結構在關聯式容器中的應用

4.set

4.1概念與性質

4.2使用

5.multiset

5.1概念與性質

5.2使用

6.map

6.1概念與性質

6.2使用

7.multimap

7.1概念與性質

7.2使用

8.小結


(圖像由AI生成)?

0.前言

在C++編程中,標準模板庫(STL)提供了許多有用的容器,如vectorlistdequeforward_list等,這些容器被統稱為序列式容器,因為它們底層是線性序列的數據結構,存儲的是元素本身。然而,STL中還有一類非常重要的容器,它們通過鍵值對(key-value pairs)來組織數據,稱為關聯式容器。本文將介紹關聯式容器中的setmultisetmapmultimap

1.關聯式容器

關聯式容器不同于序列式容器,它們通過鍵值對的形式來存儲數據。關聯式容器根據鍵(key)來快速檢索對應的值(value)。與序列式容器存儲元素本身不同,關聯式容器更關注元素之間的關系,通常使用某種樹形結構(如紅黑樹)來高效地管理數據。這類容器在插入、刪除和查找操作上具有對數時間復雜度。

常見的關聯式容器包括:

  • set:存儲唯一元素的集合。
  • multiset:允許重復元素的集合。
  • map:存儲鍵值對,鍵唯一。
  • multimap:存儲鍵值對,鍵允許重復。

2.鍵值對

鍵值對是關聯式容器的核心概念。一個鍵值對由兩個部分組成:鍵(key)和值(value)。在關聯式容器中,鍵用于唯一標識一個元素,值則是與該鍵關聯的數據。鍵和值的這種關聯關系使得我們可以通過鍵快速查找到對應的值。

setmultiset中,鍵和值是相同的,實際上只存儲鍵,而沒有單獨的值。在這些容器中,每個元素即為鍵本身。

mapmultimap中,鍵和值是分開的。鍵用于唯一標識每個元素,而值是與鍵相關聯的數據。例如,在一個map容器中,我們可以通過鍵查找對應的值,就像字典一樣。

以下是鍵值對的一些特點和優勢:

  1. 唯一性:在map中,每個鍵是唯一的,這保證了查找操作的準確性。而在multimap中,雖然允許鍵重復,但每個鍵值對仍然是唯一的。
  2. 快速查找:關聯式容器通常通過某種平衡樹結構(如紅黑樹)實現,能夠在對數時間內完成查找操作。
  3. 自動排序:鍵值對按照鍵自動排序,這使得關聯式容器不僅可以高效地進行查找,還可以方便地進行范圍查詢和遍歷。

鍵值對的這種結構使得關聯式容器在處理需要快速查找和排序的數據時非常有用。接下來,我們將詳細介紹各個關聯式容器的具體概念與使用方法。

3.樹形結構的關聯式容器

樹形結構是實現關聯式容器的核心技術之一。關聯式容器通常使用平衡樹(如紅黑樹)來管理內部數據。這種樹形結構能夠保持數據的有序性,同時保證插入、刪除和查找操作的高效性。

3.1樹形結構的特點

  1. 自動排序:樹形結構中的元素按照鍵值自動排序,這使得容器內的數據始終保持有序。對于setmultiset,元素本身作為鍵進行排序;對于mapmultimap,元素按照鍵排序,值與鍵關聯。

  2. 平衡性:平衡樹通過自我調整,保持樹的高度盡可能小,從而保證了操作的效率。紅黑樹是一種常見的平衡樹,它在最壞情況下仍能保證對數時間復雜度的操作性能。

  3. 高效操作:由于樹形結構的特性,插入、刪除和查找操作的時間復雜度為O(log n),這是通過線性搜索無法達到的。

3.2樹形結構在關聯式容器中的應用

  • set和multiset:使用樹形結構來存儲唯一或允許重復的元素,并保持它們的有序性。
  • map和multimap:利用樹形結構存儲鍵值對,通過鍵來組織和查找數據,保證鍵的唯一性或允許重復鍵。

4.set

4.1概念與性質

  1. 有序存儲set是按照一定次序存儲元素的容器。在set中,元素始終保持有序。
  2. 唯一性:在set中,元素的值(value)也標識它(value就是key,類型為T),并且每個value必須是唯一的。set中的元素不能在容器中修改(元素總是const),但是可以從容器中插入或刪除它們。
  3. 內部排序:在內部,set中的元素總是按照其內部比較對象(類型比較)所指示的特定嚴格弱排序準則進行排序。
  4. 訪問速度set容器通過key訪問單個元素的速度通常比unordered_set容器慢,但它們允許根據順序對子集進行直接迭代。
  5. 實現方式set在底層是用二叉搜索樹(紅黑樹)實現的。

注意

  1. map/multimap不同,map/multimap中存儲的是真正的鍵值對<key, value>,set中只放value,但在底層實際存放的是由<value, value>構成的鍵值對。
  2. set中插入元素時,只需要插入value即可,不需要構造鍵值對。
  3. set中的元素不可以重復(因此可以使用set進行去重)。
  4. 使用set的迭代器遍歷set中的元素,可以得到有序序列。
  5. set中的元素默認按照小于來比較。
  6. set中查找某個元素,時間復雜度為O(log n)。
  7. set中的元素不允許修改。這是因為修改元素會破壞set的有序性和唯一性。
  8. set的底層使用二叉搜索樹(紅黑樹)來實現。

4.2使用

以下是一些示例代碼,展示了set的主要功能:

插入和遍歷元素

#include <iostream>
#include <set>int main() {std::set<int> mySet;// 插入元素mySet.insert(10);mySet.insert(5);mySet.insert(20);mySet.insert(10); // 重復元素,不會插入// 遍歷元素for (const auto& elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

查找元素

#include <iostream>
#include <set>int main() {std::set<int> mySet = {10, 5, 20};// 查找元素auto it = mySet.find(10);if (it != mySet.end()) {std::cout << "Found: " << *it << std::endl;} else {std::cout << "Not Found" << std::endl;}return 0;
}

刪除元素

#include <iostream>
#include <set>int main() {std::set<int> mySet = {10, 5, 20};// 刪除元素mySet.erase(10);// 遍歷元素for (const auto& elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

?使用自定義比較函數

#include <iostream>
#include <set>struct Compare {bool operator()(const int& a, const int& b) const {return a > b; // 降序排列}
};int main() {std::set<int, Compare> mySet = {10, 5, 20};// 遍歷元素for (const auto& elem : mySet) {std::cout << elem << " ";}std::cout << std::endl;return 0;
}

5.multiset

5.1概念與性質

  1. 有序存儲multiset是按照特定順序存儲元素的容器,其中元素是可以重復的。
  2. 元素識別:在multiset中,元素的值(value)也會識別它(因為multiset中本身存儲的就是<value, value>組成的鍵值對,因此value本身就是key,key就是value,類型為T)。multiset元素的值不能在容器中進行修改(因為元素總是const的),但可以從容器中插入或刪除。
  3. 排序規則:在內部,multiset中的元素總是按照其內部比較規則(類型比較)所指示的特定嚴格弱排序準則進行排序。
  4. 訪問速度multiset容器通過key訪問單個元素的速度通常比unordered_multiset容器慢,但當使用迭代器遍歷時會得到一個有序序列。
  5. 底層實現multiset底層結構為二叉搜索樹(紅黑樹)。

注意

  1. multiset在底層中存儲的是<value, value>的鍵值對。
  2. multiset的插入接口中只需要插入value即可。
  3. set的區別是,multiset中的元素可以重復,而set中的value是唯一的。
  4. 使用迭代器對multiset中的元素進行遍歷,可以得到有序的序列。
  5. multiset中的元素不能修改。
  6. multiset中查找某個元素的時間復雜度為O(log N)。
  7. multiset的作用是可以對元素進行排序。

5.2使用

以下是一個結合代碼介紹multiset主要功能的示例:

#include <iostream>
#include <set>int main() {// 創建一個multiset容器std::multiset<int> myMultiset;// 插入元素myMultiset.insert(10);myMultiset.insert(20);myMultiset.insert(10); // 重復元素myMultiset.insert(15);myMultiset.insert(10); // 重復元素// 遍歷multiset中的元素std::cout << "Elements in myMultiset:" << std::endl;for (const auto& elem : myMultiset) {std::cout << elem << " ";}std::cout << std::endl;// 查找某個元素auto it = myMultiset.find(10);if (it != myMultiset.end()) {std::cout << "Found element: " << *it << std::endl;} else {std::cout << "Element not found." << std::endl;}// 刪除某個元素myMultiset.erase(10);// 遍歷multiset中的元素std::cout << "Elements in myMultiset after erasing 10:" << std::endl;for (const auto& elem : myMultiset) {std::cout << elem << " ";}std::cout << std::endl;// 使用迭代器對multiset中的元素進行遍歷,可以得到有序的序列std::cout << "Elements in myMultiset using iterator:" << std::endl;for (auto it = myMultiset.begin(); it != myMultiset.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

?輸出結果:

Elements in myMultiset:
10 10 10 15 20
Found element: 10
Elements in myMultiset after erasing 10:
15 20
Elements in myMultiset using iterator:
15 20

代碼說明

  1. 創建一個multiset容器,并插入一些元素,包括重復的元素。
  2. 使用范圍for循環遍歷并打印multiset中的所有元素。
  3. 查找并打印特定元素是否存在。
  4. 刪除特定元素后再次遍歷并打印multiset中的所有元素。
  5. 使用迭代器遍歷并打印multiset中的所有元素,展示有序的序列。

6.map

6.1概念與性質

  1. 關聯容器map是關聯容器,它按照特定的次序(按照key來比較)存儲由鍵值key和值value組合而成的元素。
  2. 鍵值對:在map中,鍵值key通常用于排序和唯一地標識元素,而值value中存儲與此鍵值key關聯的內容。鍵值key和值value的類型可能不同,并且在map的內部,key與value通過成員類型value_type綁定在一起,稱為pair:
    typedef pair<const key, T> value_type;
  3. 排序:在內部,map中的元素總是按照鍵值key進行比較排序的。
  4. 訪問速度map中通過鍵值訪問單個元素的速度通常比unordered_map容器慢,但map允許根據順序對元素進行直接迭代(即對map中的元素進行迭代時,可以得到一個有序的序列)。
  5. 下標訪問符map支持下標訪問符,即在[]中放入key,就可以找到與key對應的value。
  6. 實現方式map通常被實現為二叉搜索樹(更準確地說是平衡二叉搜索樹(紅黑樹))。

6.2使用

以下是一個結合代碼介紹map主要功能的示例:

#include <iostream>
#include <map>int main() {// 創建一個map容器std::map<int, std::string> myMap;// 插入元素myMap[1] = "one";myMap[2] = "two";myMap[3] = "three";// 遍歷map中的元素std::cout << "Elements in myMap:" << std::endl;for (const auto& elem : myMap) {std::cout << elem.first << " => " << elem.second << std::endl;}// 查找某個元素auto it = myMap.find(2);if (it != myMap.end()) {std::cout << "Found element with key 2: " << it->second << std::endl;} else {std::cout << "Element with key 2 not found." << std::endl;}// 刪除某個元素myMap.erase(2);// 遍歷map中的元素std::cout << "Elements in myMap after erasing key 2:" << std::endl;for (const auto& elem : myMap) {std::cout << elem.first << " => " << elem.second << std::endl;}// 使用下標訪問符修改元素myMap[1] = "ONE";std::cout << "Modified element with key 1: " << myMap[1] << std::endl;return 0;
}

輸出結果:

Elements in myMap:
1 => one
2 => two
3 => three
Found element with key 2: two
Elements in myMap after erasing key 2:
1 => one
3 => three
Modified element with key 1: ONE

代碼說明

  1. 創建map容器:創建一個map容器,用于存儲int類型的鍵和std::string類型的值。
  2. 插入元素:使用下標操作符插入元素。
  3. 遍歷元素:使用范圍for循環遍歷并打印map中的所有元素,展示鍵值對。
  4. 查找元素:使用find函數查找特定鍵的元素,并打印是否找到該元素。
  5. 刪除元素:使用erase函數刪除特定鍵的元素,并再次遍歷打印剩余的元素。
  6. 修改元素:使用下標操作符修改特定鍵的值,并打印修改后的結果。

7.multimap

7.1概念與性質

  1. 關聯式容器multimap是關聯式容器,它按照特定的順序存儲由key和value映射成的鍵值對<key, value>,其中多個鍵值對之間的key是可以重復的。
  2. 鍵值對:在multimap中,鍵值對按照key排序和唯一地標識元素,而映射的value存儲與key關聯的內容。key和value的類型可能不同,通過multimap內部的成員類型value_type組合在一起,value_type是組合key和value的鍵值對:
    typedef pair<const Key, T> value_type;
  3. 排序規則:在內部,multimap中的元素總是通過其內部比較對象,按照指定的特定嚴格弱排序標準對key進行排序。
  4. 訪問速度multimap通過key訪問單個元素的速度通常比unordered_multimap容器慢,但是使用迭代器直接遍歷multimap中的元素可以得到關于key有序的序列。
  5. 實現方式multimap在底層用二叉搜索樹(紅黑樹)來實現。

注意multimapmap的唯一不同就是:map中的key是唯一的,而multimap中key是可以重復的。

7.2使用

以下是一個結合代碼介紹multimap主要功能的示例:

#include <iostream>
#include <map>int main() {// 創建一個multimap容器std::multimap<int, std::string> myMultimap;// 插入元素myMultimap.insert({1, "one"});myMultimap.insert({2, "two"});myMultimap.insert({1, "uno"});  // 重復keymyMultimap.insert({3, "three"});// 遍歷multimap中的元素std::cout << "Elements in myMultimap:" << std::endl;for (const auto& elem : myMultimap) {std::cout << elem.first << " => " << elem.second << std::endl;}// 查找某個元素auto it = myMultimap.find(1);if (it != myMultimap.end()) {std::cout << "Found element with key 1: " << it->second << std::endl;} else {std::cout << "Element with key 1 not found." << std::endl;}// 刪除某個元素myMultimap.erase(2);// 遍歷multimap中的元素std::cout << "Elements in myMultimap after erasing key 2:" << std::endl;for (const auto& elem : myMultimap) {std::cout << elem.first << " => " << elem.second << std::endl;}// 使用迭代器遍歷multimap中的元素std::cout << "Elements in myMultimap using iterator:" << std::endl;for (auto it = myMultimap.begin(); it != myMultimap.end(); ++it) {std::cout << it->first << " => " << it->second << " ";}std::cout << std::endl;return 0;
}

輸出結果:

Elements in myMultimap:
1 => one
1 => uno
2 => two
3 => three
Found element with key 1: one
Elements in myMultimap after erasing key 2:
1 => one
1 => uno
3 => three
Elements in myMultimap using iterator:
1 => one 1 => uno 3 => three

?代碼說明

  1. 創建multimap容器:創建一個multimap容器,用于存儲int類型的鍵和std::string類型的值。
  2. 插入元素:使用insert函數插入元素,包括重復的鍵。
  3. 遍歷元素:使用范圍for循環遍歷并打印multimap中的所有元素,展示鍵值對。
  4. 查找元素:使用find函數查找特定鍵的元素,并打印是否找到該元素。
  5. 刪除元素:使用erase函數刪除特定鍵的元素,并再次遍歷打印剩余的元素。
  6. 使用迭代器遍歷元素:使用迭代器遍歷并打印multimap中的所有元素,展示有序的序列。

注意

  1. multimap中的key是可以重復的。
  2. multimap中的元素默認將key按照小于來比較。
  3. multimap中沒有重載operator[]操作,這是因為operator[]需要唯一的鍵來訪問對應的值,而multimap中的鍵是可以重復的,無法保證唯一性。

8.小結

在C++中,關聯式容器如setmultisetmapmultimap通過鍵值對來高效地管理和存儲數據。這些容器利用平衡樹結構(如紅黑樹)保證操作的有序性和高效性。setmultiset用于存儲唯一和重復的有序元素,而mapmultimap則通過鍵值對實現鍵的唯一和重復存儲。理解和使用這些容器可以幫助我們在編程中高效地處理各種復雜的數據結構和操作需求。

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

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

相關文章

Spring MVC 中 HttpMessageConverter 轉換器

1. Spring MVC 中 HttpMessageConverter 轉換器 文章目錄 1. Spring MVC 中 HttpMessageConverter 轉換器2. 補充&#xff1a;什么是 HTTP 消息3. 轉換器3.1 轉換器轉換的是什么 4. Spring MVC中的 AJAX 請求5. ResponseBody 將服務器端的 return 返回值轉化為“字符串(JSON格式…

大語言模型-基礎及拓展應用

一、基礎模型 1、Transformer 2、bert 3、gpt 二、大語言模型 三、句子向量 四、文檔解析 1、通用解析 2、docx解析 3、 pdf解析 4、pptx解析 五、向量數據庫

rtf是什么格式的文件?rtf格式和word的區別是什么?

RTF是什么格式的文件? RTF&#xff08;富文本格式&#xff0c;Rich Text Format&#xff09;和Word文檔&#xff08;以.doc和.docx為擴展名的Microsoft Word文檔&#xff09;是兩種常用的文本文件格式。它們在文件結構、兼容性、功能和使用場景等方面存在一些顯著差異。 比如…

Android 14新特性:選擇性照片和視頻訪問授權

Android 14 引入了選擇性照片和視頻訪問授權的新特性&#xff0c;這是一項旨在增強用戶隱私和數據安全的重要更新。在之前的 Android 版本中&#xff0c;應用程序請求訪問設備上的照片和視頻時&#xff0c;通常會要求完全訪問權限&#xff0c;這意味著應用可以訪問用戶圖庫中的…

arcgis怎么選取某個指定區域地方的數據,比如從全國鄉鎮數據選取長沙市鄉鎮數據

一共5個步驟&#xff0c;沒一句廢話&#xff0c;耐心看完。 1、如圖&#xff0c;先將數據加載到arcgis里面&#xff0c;我們要選取里面長沙市的范圍數據。 2、選取長沙市的語句 “市” like ‘長沙%’ 切記&#xff0c;切記&#xff0c;切記。所有符號要在 輸入法英文狀態…

微信小程序 vant-weapp的 SwipeCell 滑動單元格 van-swipe-cell 滑動單元格不顯示 和 樣式問題 滑動后刪除樣式不顯示

在微信小程序開發過程中 遇到個坑 此處引用 swipeCell 組件 剛開始是組件不顯示 然后又遇到樣式不生效 首先排除問題 是否在.json文件中引入了組件 {"usingComponents": {"van-swipe-cell": "vant/weapp/swipe-cell/index","van-cell-gro…

電腦系統重裝數據被格式化,那些文件還有辦法恢復嗎?

在日常使用電腦的過程中&#xff0c;系統重裝或格式化操作是常見的維護手段&#xff0c;尤其是在遇到系統崩潰、病毒感染或需要升級系統時。然而&#xff0c;這一操作往往伴隨著數據丟失的風險&#xff0c;尤其是當C盤&#xff08;系統盤&#xff09;和D盤&#xff08;或其他數…

linux|多線程(一)

主要介紹了為什么要有線程 和線程的調用 和簡單的對線程進行封裝。 背景知識 a.重談地址空間 我們知道物理內存的最小單元大小是4kB 物理內存是4G那么這樣的單元友1M個 操作系統先描述再組織struct page[1M] 對于32位數據字長的機器&#xff0c;頁表有2^32條也就是4G條&#…

嵌入式linux相機 轉換模塊

convert_manager.c #include <config.h> #include <convert_manager.h> #include <string.h>static PT_VideoConvert g_ptVideoConvertHead NULL;/*********************************************************************** 函數名稱&#xff1a; Register…

異常檢測在機器學習中的重要性

異常檢測在機器學習中的重要性 在機器學習領域&#xff0c;異常檢測&#xff08;Anomaly Detection&#xff09;是一種識別數據集中異常或不尋常模式的任務。這些異常點可能代表錯誤、噪聲、或更有趣的是&#xff0c;它們可能揭示了某些異常行為或新現象。異常檢測在許多領域都…

LabVIEW Communications LTE Application Framework 讀書筆記

目錄 硬件要求一臺設備2臺USRPUSRP-2974 示例項目的組件文件夾結構DL Host.gcompeNodeB Host.gcompUE Host.gcompBuildsCommonUSRP RIOLTE 操作模式DLeNodeBUE 項目組件單機雙機UDP readUDP writeMAC TXMAC RXDL TX PHYDL RX PHYUL TX PHYUL RX PHYSINR calculationRate adapta…

Vue + litegraph.js 實現藍圖功能

Vue3 litegraph.js 實現藍圖功能 litegraph.js [github](https://github.com/jagenjo/litegraph.js) [demo](https://tamats.com/projects/litegraph/editor/)vue - html <canvas id"mycanvas" width"1524" height"720" style"border…

PostgreSQL數據庫從入門到精通系列之九:PostgreSQL數據庫13版本和PostgreSQL數據庫14版本功能特性

PostgreSQL數據庫從入門到精通系列之九:PostgreSQL數據庫13版本和PostgreSQL數據庫14版本功能特性 一、PostgreSQL數據庫版本13新功能和特性二、PostgreSQL13相比于PostgreSQL12功能改進三、PostgreSQL數據庫14版本新功能和特性一、PostgreSQL數據庫版本13新功能和特性 Postg…

R語言優雅的把數據基線表(表一)導出到word

基線表&#xff08;Baseline Table&#xff09;是醫學研究中常用的一種數據表格&#xff0c;用于在研究開始時呈現參與者的初始特征和狀態。這些特征通常包括人口統計學數據、健康狀況和疾病史、臨床指標、實驗室檢測、生活方式、社會經濟等。 本人在既往文章《scitb包1.6版本發…

無人機之機型區別與應用領域

一、多旋翼無人機 特點&#xff1a;多旋翼無人機依靠產生升力以平衡飛行器的重力&#xff0c;通過改變每個旋翼的轉速來控制飛行姿態&#xff0c;能夠懸停和垂直起降。他們具備體積小、重量輕、噪音小、隱蔽性好的特點&#xff0c;操作靈活且易于維護。 應用&#xff1a;多旋…

Springboot Excel 導出工具 -- EasyPoi 簡介

EasyPoi是一款基于 Apache POI 的高效 Java 工具庫&#xff0c;專為簡化 Excel 和 Word 文檔的操作而設計。以下是對 EasyPoi 的詳細介紹&#xff1a; 一、概述 名稱&#xff1a;EasyPoi類型&#xff1a;Java 庫功能&#xff1a;簡化 Excel 和 Word 文檔的操作&#xff0c;包…

uni-app:文字豎直排列,并且在父級view中水平豎直對齊

一、效果 二、代碼 <template><view class"parent"><text class"child">這是豎直排列的文字</text></view> </template> <script>export default {data() {return {}},methods: {},}; </script> <sty…

Vue 實現文章錨點定位,頂欄遮住了錨點,使用scrollTo代替scrollIntoView設置偏移量

在Vue中實現文章錨點功能&#xff0c;可以通過監聽滾動事件來更新當前錨點的狀態。以下是一個簡單的示例&#xff1a; <template><div><div :id"anchor- index" v-for"(section, index) in sections" :key"index">{{ sectio…

React和Vue.js的相似性和差異性是什么?

React 和 Vue.js 都是流行的前端 JavaScript 框架&#xff0c;它們有一些相似性和差異性&#xff1a; 相似性&#xff1a; 組件化&#xff1a;React 和 Vue.js 都支持組件化開發&#xff0c;允許開發者將界面拆分為獨立的組件&#xff0c;提高代碼的復用性和可維護性。…

學習小記-Kafka相較于其他MQ有啥優勢?

Kafka 相比于 RocketMQ 有以下幾個優勢&#xff1a; 1. 高吞吐量和低延遲&#xff1a; Kafka 以其出色的 I/O 性能和分布式架構設計&#xff0c;能夠實現極高的吞吐量&#xff0c;每秒數百萬的消息處理能力&#xff0c;適合大規模數據流處理。同時&#xff0c;Kafka 設計為…