【C++進階篇】C++容器完全指南:掌握set和map的使用,提升編碼效率

C++容器的實踐與應用:輕松掌握set、map與multimap的區別與用法

  • 一. 序列式容器與關聯式容器
    • 1.1 序列式容器 (Sequential Containers)
    • 1.2 關聯式容器 (Associative Containers)
  • 二. set系列使用
    • 2.1 set的構造和迭代器
    • 2.2 set的增刪查
      • 2.2.1 插入
      • 2.2.2 查找
      • 2.2.3 刪除
    • 2.3 multiset和set的差異
  • 三. map系列使用
    • 3.1 pair類
      • 3.1.1 定義與創建
      • 3.1.2 訪問元素
    • 3.2 map構造
    • 3.3 map增刪查
      • 3.3.1 插入
      • 2.2.2 查找
      • 2.2.3 刪除
    • 3.4 map[]功能(重點)
      • 3.4.1 基本功能
      • 3.4.2 返回值類型
      • 3.4.3 自動插入特性
    • 3.5 multimap和map的差異
  • 四. 最后

在C++中,容器是存儲和操作數據的核心工具。序列式容器(如vector、list)通過線性順序存儲數據,而關聯式容器(如set、map)則通過鍵值對存儲數據,允許更高效的查找、插入和刪除。set是一個存儲唯一元素的容器,內部自動排序,底層通常使用紅黑樹實現。它支持高效的查找和元素去重。map是存儲鍵值對的容器,每個鍵都是唯一的,值可以重復,同樣基于紅黑樹實現,提供快速的鍵值對查找。在需要快速檢索、插入或刪除元素時,set和map是非常實用的選擇。

一. 序列式容器與關聯式容器

1.1 序列式容器 (Sequential Containers)

序列式容器按照元素的插入順序進行存儲,它們提供了對元素的線性訪問。序列式容器的元素是有順序的,可以通過下標或迭代器來訪問。常見的序列式容器包括:

  • vector:動態數組,支持快速的隨機訪問。適用于頻繁訪問元素,但在中間插入或刪除元素時性能較差。

  • deque:雙端隊列,支持在兩端快速插入和刪除元素,但相比 vector,在訪問和修改元素時稍慢。

  • list:雙向鏈表,支持在任意位置快速插入和刪除元素,但不支持隨機訪問。

  • array:固定大小的數組,支持快速隨機訪問,但在大小固定時使用。

  • forward_list:單向鏈表,比 list 更節省內存,但只支持向前遍歷。

1.2 關聯式容器 (Associative Containers)

關聯式容器是基于鍵值對的容器,每個元素由鍵和值組成,并且通過鍵進行訪問。它們通常提供基于鍵的排序和查找功能,能夠高效地查找、插入和刪除元素。常見的關聯式容器包括:

  • set:存儲唯一元素的集合,自動排序。可以高效地判斷元素是否存在。

  • map:存儲鍵值對,其中每個鍵都是唯一的,值可以重復。自動按照鍵排序。

  • multiset:與 set 類似,但允許存儲重復的元素。

  • multimap:與 map 類似,但允許存儲重復的鍵。

聲明:本篇文章重點介紹關聯式容器中的set,map

二. set系列使用

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

2.1 set的構造和迭代器

set的迭代器是雙向迭代器,遍歷默認是升序的,因為底層說到底還是二叉搜索樹,所以迭代器(const和非const版本迭代器)都不支持修改數據,會破壞二叉搜索樹的結構。

構造類型原型功能
無參默認構造explicit set (const key_compare& comp = key_compare(),const allocator_type& alloc = allocator_type());構造一個指定類型T的對象
迭代器區間構造template set(InputIterator first, InputIterator last,const key_compare & comp = key_compare(),const allocator_type & = allocator_type());使用迭代器區間初始化對象
初始化列表構造set(initializer_list<value_type> il,const key_compare & comp = key_compare(),const allocator_type & alloc = allocator_type());使用初始化列表構造對象
拷貝構造set (const set& x);使用拷貝構造對象
迭代器原型功能
正向迭代器iterator begin();iterator end()正向遍歷容器中的數據
反向迭代器reverse_iterator rbegin();reverse_iterator rend();反向遍歷容器中的數據

下面將給出一個整合代碼演示上述的功能:

  • 示例代碼:
#include<iostream>
#include<set>
using namespace std;int main()
{//無參默認構造set<int> s1;cout << "修改前s1: ";for (auto ch : s1){cout <<"原:s1 " << ch;}cout << endl;//迭代器區間構造set<int> s2({ 1,2,3,4,5,6,7,8,9,10 });//initializer 列表構造//set<int> s1(s2.begin(), s2.end());錯誤寫法,s1重定義//使用賦值,或者直接插入//s1.insert(s2.begin(),s2.end())s1 = set<int>(s2.begin(), s2.end());//創建臨時對象,進行賦值cout << "修改后s1:";for (auto ch : s1){cout << ch << " ";}cout << endl;//拷貝構造set<int> s3(s1);cout << "s3: ";for (auto ch : s3){cout <<ch << " ";}cout << endl;// 正確的反向遍歷cout << "Reverse traversal of s3: ";for (auto rit = s3.rbegin(); rit != s3.rend(); ++rit) {cout << *rit << " ";}cout << endl;return 0;
}

2.2 set的增刪查

2.2.1 插入

類型原型功能
單個插入pair<iterator,bool> insert (const value_type& val);插入單個數據,插入已經存在插入失敗
列表插入insert (initializer_list<value_type> il);使用初始化列表插入元素
迭代器區間插入template void insert(InputIterator first, InputIterator last);使用迭代器區間插入元素

下面將給出一個整合代碼演示上述的功能:

  • 示例代碼:
#include<iostream>
#include<set>
using namespace std;int main()
{int a = 10;set<int> s;s.insert(a);//插入單個數據for (auto ch : s){cout << ch;}cout << endl;s.insert({ 1,2,3,4,5,6,7,8,9 });//初始化列表插入for (auto ch : s){cout << ch<<" ";}cout << endl;set<int> s3({ 10,20,30,40,50,60,70,80,90,100 });s.insert(s3.begin(), s3.end());//迭代器區間插入數據for (auto ch : s){cout << ch << " ";}cout << endl;return 0;
}

2.2.2 查找

類型原型功能
查找單個元素iterator find (const value_type& val);查找val,返回val所在的迭代器,沒有找到返回end()
查找每個元素的總出現個數size_type count (const value_type& val) const;查找val,返回Val的個數

下面將給出一個整合代碼演示上述的功能:

  • 示例代碼:

#include<iostream>
#include<set>
using namespace std;int main()
{set<int> s;s.insert({ 1,2,3,4,5,6,7,8,9 });//初始化列表插入for (auto ch : s){cout << ch<<" ";}cout << endl;auto it = s.find(6);//存在返回所在迭代器cout << *it << endl;it = s.find(10);//不存在不可進行解引用//cout << *it << endl;error程序會終止int ret = s.count(6);cout << ret << endl;//查找6出現的總個數return 0;
}

2.2.3 刪除

類型原型功能
刪除單個元素size_type erase (const value_type& val);刪除val,val不存在返回0,存在返回1
刪除迭代器位置iterator erase (const_iterator position);刪除?個迭代器位置的值
刪除迭代器區間iterator erase (const_iterator first, const_iterator last)刪除?段迭代器區間的值

下面將給出一個整合代碼演示上述的功能:

  • 示例代碼:
#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>
#include<set>
using namespace std;int main()
{set<int> s;s.insert({ 1,2,3,4,5,6,7,8,9 });//初始化列表插入cout << "刪除前: ";for (auto ch : s){cout << ch<<" ";}cout << endl;cout << "刪除5后: ";s.erase(5);//刪除單個值for (auto ch : s){cout << ch << " ";}cout << endl;cout << "刪除8后: ";auto it = s.find(8);s.erase(it);//刪除迭代器位置的值for (auto ch : s){cout << ch << " ";}cout << endl;cout << "全部刪除后: ";s.erase(s.begin(), s.end());//刪除迭代器區間區間的值,等效于s.clear()for (auto ch : s){cout << ch << " ";}cout << endl;return 0;
}

補充:

// 返回?于等val位置的迭代器

  • iterator lower_bound (const value_type& val) const;

// 返回?于val位置的迭代器

  • iterator upper_bound (const value_type& val) const;

2.3 multiset和set的差異

multiset和set的使?基本完全類似,主要區別點在于multiset?持值冗余,說白就是允許插入相同的值。
下面主要來看insert/find/count/erase都圍繞著?持值冗余有所差異,示例代碼:


```cpp
#include<iostream>
#include<set>
using namespace std;
int main()
{// 相?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;return 0;
}

三. map系列使用

map的底層是紅黑樹,key/value結構場景,也是有序的。

3.1 pair類

在C++中,pair 是標準模板庫(STL)提供的一個模板類,用于將兩個可能不同類型的對象組合成一個單一單元。

3.1.1 定義與創建

#include // 包含pair的頭文件
// 創建pair的幾種方式
std::pair<int, double> p1; // 默認構造,兩個元素被值初始化
std::pair<int, double> p2(1, 3.14); // 直接初始化 std::pair<int,
double> p3 = {2, 2.718}; // 列表初始化(C++11起) auto p4 =
std::make_pair(3, 1.618); // 使用make_pair輔助函數

3.1.2 訪問元素

int first_element = p2.first; // 訪問第一個元素(int類型)
double second_element = p2.second; // 訪問第二個元素(double類型)

結論:pair 是C++中處理簡單二元組合的高效工具,在需要臨時組合兩個相關值時非常有用。對于更復雜的數據結構,建議使用 struct 或 class 來提高代碼可讀性。

3.2 map構造

map的迭代器是雙向迭代器,遍歷默認是升序的,因為底層說到底還是二叉搜索樹,所以迭代器(const和非const版本迭代器)都不支持修改數據,會破壞二叉搜索樹的結構。

構造類型原型功能
無參默認構造explicit map(const key_compare& comp = key_compare(),const allocator_type& alloc = allocator_type());構造一個指定類型T的對象
迭代器區間構造template map(InputIterator first, InputIterator last,const key_compare& comp = key_compare(),const allocator_type & = allocator_type());使用迭代器區間初始化對象
初始化列表構造map(initializer_list<value_type> il,const key_compare & comp = key_compare(),const allocator_type & alloc = allocator_type());使用初始化列表構造對象
拷貝構造map (const map& x);使用拷貝構造對象
迭代器原型功能
正向迭代器iterator begin();iterator end();正向遍歷容器中的數據
反向迭代器reverse_iterator rbegin();reverse_iterator rend();反向遍歷容器中的數據

下面將給出一個整合代碼演示上述的功能:

  • 示例代碼:
#include<iostream>
#include<map>
using namespace std;int main()
{//無參默認構造map<string, string> t1;for (auto entry : t1){cout << entry.first << " -> " << entry.second << endl;}cout << endl;//初始化列表構造map<string, string> t2({{ "apple", "蘋果" }, { "banana", "香蕉" }, { "orange", "橙子" } });for (auto entry : t2){cout << entry.first << " -> " << entry.second << endl;}cout << endl;//迭代器區間構造map<string, string> t3(t2.begin(), t2.end());for (auto entry : t3){cout << entry.first << " -> " << entry.second << endl;}cout << endl;//拷貝構造map<string, string> t4(t2);for (auto entry : t4){cout << entry.first << " -> " << entry.second << endl;}cout << endl;//正向迭代器遍歷auto it = t4.begin();while (it != t4.end()){cout << it->first << " " << it->second << endl;++it;}cout << endl;//反向迭代器遍歷for (auto it = t4.rbegin(); it != t4.rend(); it++){cout << it->first << " " << it->second << endl;}return 0;
}

3.3 map增刪查

3.3.1 插入

類型原型功能
單個插入pair<iterator,bool> insert (const value_type& val);單個數據插?,如果已經key存在則插?失敗,key存在相等value不相等也會插?失敗
列表插入void insert (initializer_list<value_type> il);列表插?,已經在容器中存在的值不會插?
迭代器區間插入template void insert(InputIterator first, InputIterator last);使用迭代器區間插入元素

下面將給出一個整合代碼演示上述的功能:

  • 示例代碼:

#include<iostream>
#include<map>
using namespace std;int main()
{pair<string, string> s("insert", "插入");map<string, string> t1;t1.insert(s);//插入單個元素cout << "t1: ";for (auto entry : t1){cout << entry.first << " -> " << entry.second << endl;}cout << endl;map<string, string> t2;t2.insert({ { "apple", "蘋果" }, { "banana", "香蕉" }, { "orange", "橙子" } });//初始化列表插入cout << "t2: ";for (auto entry : t2){cout << entry.first << " -> " << entry.second << endl;}cout << endl;map<string, string> t3;t3.insert(t2.begin(), t2.end());//迭代器區間插入cout << "t3: ";for (auto entry : t3){cout << entry.first << " -> " << entry.second << endl;}cout << endl;return 0;
}

2.2.2 查找

類型原型功能
查找單個元素iterator find (const value_type& val);查找val,返回val所在的迭代器,沒有找到返回end()
查找每個元素的總出現個數size_type count (const value_type& val) const;查找val,返回Val的個數

下面將給出一個整合代碼演示上述的功能:

  • 示例代碼:
#include<iostream>
#include<map>
using namespace std;int main()
{map<string, string> t2;t2.insert({ { "apple", "蘋果" },{ "apple", "蘋果" },{ "apple", "蘋果" }, { "banana", "香蕉" }, { "orange", "橙子" } });//初始化列表插入cout << "t2: ";for (auto entry : t2){cout << entry.first << " -> " << entry.second << endl;}auto it = t2.find("apple");//返回apple位置所在的迭代器cout << it->first << " " << it->second << endl;int ret = t2.count("apple");//查找apple出現的總次數cout << ret << endl;return 0;
}

2.2.3 刪除

類型原型功能
刪除單個元素size_type erase (const value_type& val);刪除val,val不存在返回0,存在返回1
刪除迭代器位置iterator erase (const_iterator position);刪除?個迭代器位置的值
刪除迭代器區間iterator erase (const_iterator first, const_iterator last)刪除?段迭代器區間的值

示例代碼:


#include<iostream>
#include<map>
using namespace std;int main()
{map<string, string> t2;t2.insert({ { "apple", "蘋果" },{ "apple", "蘋果" },{ "apple", "蘋果" }, { "banana", "香蕉" }, { "orange", "橙子" } });//初始化列表插入cout << "刪除前t2: ";for (auto entry : t2){cout << entry.first << " -> " << entry.second << endl;}cout << endl;t2.erase("apple");//刪除指定元素值cout << "前t2: ";for (auto entry : t2){cout << entry.first << " -> " << entry.second << endl;}cout << endl;auto it = t2.find("orange");t2.erase(it);//刪除迭代器位置的值cout << "中t2: ";for (auto entry : t2){cout << entry.first << " -> " << entry.second << endl;}cout << endl;t2.erase(t2.begin(), t2.end());//刪除迭代器區間的值cout << "后t2: ";for (auto entry : t2){cout << entry.first << " -> " << entry.second << endl;}return 0;
}

3.4 map[]功能(重點)

3.4.1 基本功能

  1. 訪問元素:如果鍵存在于map中,operator[]會返回該鍵對應的值的引用。
  2. 修改元素:通過返回的引用,可以直接修改該鍵對應的值。
  3. 插入元素:如果鍵不存在于map中,operator[]會插入一個新的鍵值對,其中鍵是給定的鍵,值是值類型的默認構造值(對于內置類型如int、string等,默認構造值通常是0或空字符串;對于自定義類型,則是其默認構造函數創建的對象)。

3.4.2 返回值類型

operator[]返回的是值的引用(value_type&),這允許對值進行直接修改。

3.4.3 自動插入特性

當使用operator[]訪問一個不存在的鍵時,map會自動插入一個新的鍵值對。
新插入的鍵的值部分是其值類型的默認構造值。

  • 使用實例:
#include<iostream>
#include<map>
#include<string>
using namespace std;int main() {map<string, int> wordCount;// 訪問并修改現有元素wordCount["apple"] = 10; // 插入或修改鍵為"apple"的元素cout << "apple: " << wordCount["apple"] << endl; // 輸出: apple: 10// 訪問不存在的鍵,自動插入新元素cout << "banana: " << wordCount["banana"] << endl; // 輸出: banana: 0(因為int的默認構造值是0)// 修改自動插入的元素wordCount["banana"] += 5;cout << "banana: " << wordCount["banana"] << endl; // 輸出: banana: 5// 使用at()方法訪問元素(需要確保鍵存在)try {cout << "orange: " << wordCount.at("orange") << endl;} catch (const out_of_range& e) {cout << "orange: " << e.what() << endl; // 輸出: orange: map::at: key not found}return 0;
}

3.5 multimap和map的差異

multimap和map的使?基本完全類似,主要區別點在于multimap?持關鍵值key冗余,那么
insert/find/count/erase都圍繞著?持關鍵值key冗余有所差異,

  • 示例代碼:
#include <iostream>
#include <map>
#include <string>using namespace std;int main() {// 創建multimap并插入數據multimap<string, int> scores = {{"Alice", 90},{"Bob", 85},{"Alice", 95},  // 允許重復的key{"Charlie", 88}};// 1. 查找操作(返回第一個匹配項)auto it = scores.find("Alice");if (it != scores.end()) {cout << "找到Alice的第一個分數: " << it->second << endl; // 輸出90}// 2. 計數操作(統計重復key的數量)int count = scores.count("Alice");cout << "Alice出現的次數: " << count << endl; // 輸出2// 3. 范圍查找(獲取所有匹配項)cout << "所有Alice的分數: ";auto range = scores.equal_range("Alice");for (auto itr = range.first; itr != range.second; ++itr) {cout << itr->second << " "; // 輸出90 95}cout << endl;// 4. 刪除操作(刪除所有匹配項)scores.erase("Alice");cout << "刪除Alice后剩余元素數量: " << scores.size() << endl; // 輸出2(Bob和Charlie)// 5. 嘗試使用[]操作符(會編譯失敗)// scores["David"] = 78; // 錯誤:multimap不支持[]操作符return 0;
}

通過這個示例可以看出,multimap在處理需要多個相同key的場景時比map更靈活,但相應地也失去了一些特性(如[]操作符的直接訪問能力)。在實際開發中,應根據是否需要key唯一性來選擇合適的數據結構。

四. 最后

本文詳述了C++中關聯式容器set、multiset、map、multimap的用法,涵蓋構造、迭代器、增刪查等操作。set自動排序去重,multiset允許重復;map存儲鍵值對,multimap支持鍵冗余。重點解析了map的[]操作符自動插入特性及multimap的范圍查找。通過代碼示例展示了各容器的核心功能與應用場景,是學習C++標準庫關聯容器的實用指南。

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

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

相關文章

2_Spring【IOC容器中獲取組件Bean】

Spring中IOC容器中獲取組件Bean 實體類 //接口 public interface TestDemo {public void doSomething(); } // 實現類 public class HappyComponent implements TestDemo {public void doSomething() {System.out.println("HappyComponent is doing something...")…

安卓開飯-ScrollView內嵌套了多個RecyclerView,只想與其中一個RecyclerView有聯動

在 Android 開發中&#xff0c;將 RecyclerView 嵌套在 ScrollView 內通常會導致性能問題和滾動沖突&#xff0c;應盡量避免這種設計。以下是原因和替代方案&#xff1a; 為什么不推薦 RecyclerView ScrollView&#xff1f;?? 性能損耗? RecyclerView 本身已自帶高效回收復…

HTTP 請求中 Content-Type 頭部

HTTP 請求中 Content-Type 頭部可以設置的各種不同的傳輸格式。multipart/form-data 只是其中一種,主要用于傳輸包含文件的數據。 以下是一些常見的 HTTP 請求體的 Content-Type 及其用途: 常見的數據傳輸格式 (Content-Type) 列表: application/json: 描述: 用于傳輸 JSO…

【U-boot 命令使用】

文章目錄 1 查詢有哪些命令2 信息查詢命令dbinfo - 查看板子信息printenv- 輸出環境變量信息version - 輸出uboot版本信息 3 環境變量操作命令修改環境變量新建環境變量刪除環境變量 4 內存操作命令md命令nm命令mm命令mv命令cp命令cmp命令 5 網絡操作命令與網絡有關的環境變量p…

初學者如何用 Python 寫第一個爬蟲?

初學者如何用 Python 寫第一個爬蟲&#xff1f; 一、爬蟲的基本概念 &#xff08;一&#xff09;爬蟲的定義 爬蟲&#xff0c;英文名為 Web Crawler&#xff0c;也被叫做網絡蜘蛛、網絡機器人。想象一下&#xff0c;有一個勤勞的小蜘蛛&#xff0c;在互聯網這個巨大的蜘蛛網中…

IDE/IoT/搭建物聯網(LiteOS)集成開發環境,基于 VSCode + IoT Link 插件

文章目錄 概述IDE安裝安裝舊版本VSCode安裝插件安裝問題和解決手動安裝SDK包手動下載依賴工具 IoTLink配置IoTLink Home用戶設置-工具鏈-編譯器用戶設置-工具鏈-構建器用戶設置-工具鏈-燒錄器用戶設置-SDK管理工程設置-SDK配置工程設置-編譯器工程設置-調試器 創建工程Demo 源碼…

深度剖析:Dify+Sanic+Vue+ECharts 搭建 Text2SQL 項目 sanic-web 的 Debug 實戰

目錄 項目背景介紹sanic-web Dify\_service handle\_think\_tag報錯NoneType問題描述debug Dify調用不成功&#xff0c;一直轉圈圈問題描述debug 前端markdown格式只顯示前5頁問題描述debug1. 修改代碼2.重新構建1.1.3鏡像3.更新sanic-web/docker/docker-compose.yaml4. 重新部…

理想AI Talk第二季-重點信息總結

一、TL&#xff1b;DR 理想為什么要做自己的基模&#xff1a;座艙家庭等特殊VLM場景&#xff0c;deepseek/openai沒有解決理想的基模參數量&#xff1a;服務端-300B&#xff0c;VLencoder-32B/3.6B&#xff0c;日常工作使用-300B&#xff0c;VLA-4B為什么自動駕駛可以達成&…

TensorRT

TensorRT 下載 TensorRT 7.1.3.4 TAR壓縮包&#xff0c;解壓到安裝目錄&#xff1a; tar xzvf TensorRT-7.1.3.4.Ubuntu-16.04.x86_64-gnu.cuda-11.0.cudnn8.0.tar.gz 添加 TensorRT lib 到環境變量&#xff1a; gedit ~/.bashrc # 添加 export LD_LIBRARY_PATH$LD_LIBRARY_PAT…

【NGINX】 -9 nginx + tomcat實現的多級反向代理

文章目錄 1、tomcat的安裝 (centos版本)1.1 安裝Java依賴環境1.2 安裝tomcat 2、tomcat的虛擬主機的配置2.1 配置多級目錄 3、利用nginx的反向代理實現將轉發指向一個虛擬機3.1 nginx服務器的配置3.2 客戶端配置 4、 反向多級代理代理服務器操作nginx 1 服務器nginx 2 服務器to…

基于requests_html的python爬蟲

前言&#xff1a;今天介紹一個相對性能更高的爬蟲庫requests_html&#xff0c;會不會感覺和requests有點聯系&#xff1f;是的。為什么開始不直接介紹呢&#xff1f;因為我覺得requests是最基本入門的東西&#xff0c;并且在學習過程中也能學到很多東西。我的python老師在介紹這…

【架構篇】架構類型解釋

架構設計的本質&#xff1a;從模糊概念到系統化思維 摘要 “架構”是系統設計的靈魂&#xff0c;但許多人對它的理解仍停留在抽象層面。本文系統解析架構的8大核心維度&#xff0c;結合設計原則、案例與誤區分析&#xff0c;幫助開發者建立從戰略到落地的完整認知框架。 一、架…

用Python繪制夢幻星空

用Python繪制夢幻星空 在這篇教程中&#xff0c;我們將學習如何使用Python創建一個美麗的星空場景。我們將使用Python的圖形庫Pygame和隨機庫來創建閃爍的星星、流星和月亮&#xff0c;打造一個動態的夜空效果。 項目概述 我們將實現以下功能&#xff1a; 創建深藍色的夜…

PyTorch循環神經網絡(Pytotch)

文章目錄 循環神經網絡&#xff08;RNN&#xff09;簡單的循環神經網絡長短期記憶網絡&#xff08;LSTM&#xff09;門控循環單元&#xff08;GRU&#xff09; 循環神經網絡&#xff08;RNN&#xff09; 循環神經網絡&#xff08;RecurrentNeuralNetwork&#xff0c;RNN&#…

用算術右移實現邏輯右移及用邏輯右移實現算術右移

函數srl()用算術右移實現邏輯右移&#xff0c;函數sra()用邏輯右移實現算術右移。 程序代碼 int sra(int x,int k); unsigned int srl(unsigned int x, int k);void main() {int rx1,k,x1;unsigned int rx2,x2;k3;x10x8777;x20x8777;rx1sra(x1, k);rx2srl(x2, k);while(1); }…

pojo層、dao層、service層、controller層的作用

在Java Web開發中&#xff0c;常見的分層架構&#xff08;如Spring Boot項目&#xff09;通常包含POJO層、DAO層、Service層和Controller層&#xff0c;各層職責明確&#xff0c;協同工作。以下是各層的作用及相互關系&#xff1a; 1. POJO層&#xff08;Model/Entity層&#…

【Linux網絡】五種IO模型與阻塞IO

IO 在Linux網絡環境里&#xff0c;IO&#xff08;Input/Output&#xff09;指的是網絡數據在系統與外部網絡&#xff08;像其他設備、服務器或者客戶端&#xff09;之間進行傳輸的過程。 它是網絡編程和系統性能優化的核心內容。 IO &#xff1a;INPUT和OUTPUT&#xff08;站…

入門OpenTelemetry——應用自動埋點

埋點 什么是埋點 埋點&#xff0c;本質就是在你的應用程序里&#xff0c;在重要位置插入采集代碼&#xff0c;比如&#xff1a; 收集請求開始和結束的時間收集數據庫查詢時間收集函數調用鏈路信息收集異常信息 這些埋點數據&#xff08;Trace、Metrics、Logs&#xff09;被…

大數據場景下數據導出的架構演進與EasyExcel實戰方案

一、引言&#xff1a;數據導出的演進驅動力 在數字化時代&#xff0c;數據導出功能已成為企業數據服務的基礎能力。隨著數據規模從GB級向TB級甚至PB級發展&#xff0c;傳統導出方案面臨三大核心挑戰&#xff1a; ?數據規模爆炸?&#xff1a;單次導出數據量從萬級到億級的增長…

拓展運算符與數組解構賦值的區別

拓展運算符與數組解構賦值是ES6中用于處理數組的兩種不同的特性&#xff0c;它們有以下區別&#xff1a; 概念與作用 ? 拓展運算符&#xff1a;主要用于將數組展開成一系列獨立的元素&#xff0c;或者將多個數組合并為一個數組&#xff0c;以及在函數調用時將數組作為可變參…