【C++題解】關聯容器

關于set,map以及變種
|關聯容器| set&multiset | map&multimap |無序關聯容器| Unordered set&multiset | Unordered map&multimap |
建議先了解之后再配合練習
這次練習CCF真題比較多,也比較基礎,預計耗時不用這么久。

今天的重點是 C++ STL 中兩個非常強大的關聯式容器:mapset。它們在處理需要高效統計、去重和查找的場景時極為有用,尤其在CCF認證考試的題目中頻繁出現。

練習計劃概覽

  • 總時長: 約 4 小時

  • 核心目標:

    1. 掌握 std::map 的基本用法,用于建立鍵-值(key-value)映射,實現快速詞頻統計和數據聚合。

    2. 掌握 std::set 的基本用法,利用其自動去重和排序的特性,進行數據去重和有序集合操作。

    3. 理解 mapset 底層基于紅黑樹實現所帶來的 O(log n) 時間復雜度特性。

    4. 通過練習CCF真題,熟悉這類考點的設問方式和解題套路。


第一部分:map 的應用——統計與映射 (約 2 小時)

map 提供的是鍵(Key)到值(Value)的映射關系。它非常適合需要根據某個標識(如單詞、ID)來存儲和查詢對應信息(如出現次數、屬性)的場景。

題目編號題目名稱核心知識點練習目標
CCF202403-1詞頻統計map, set這是最經典的詞頻統計題。使用 map<int, int> 統計單詞總頻次,并可結合 set 對每篇文章的單詞去重,以統計單詞出現的文章數 1。是 mapset 結合使用的絕佳練習。(來自您提供的文件)
CCF202305-1重復局面map, vector<string>統計每個 8x8 棋盤局面出現的次數 2。本題是練習將 vector<string> 等復雜數據結構作為 map 的鍵,來進行頻次統計的絕佳題目。(來自您提供的文件)
CCF202006-2稀疏向量map<int, int>這道題是 map 應用的絕佳范例。由于向量維度很高但非零值很少(稀疏) 3,使用數組會浪費巨大空間。而用 map 只存儲非零值的下標和值,可以高效地解決空間和計算問題 4。 (CCF真題)
CCF202312-2因子化簡map在對整數進行質因數分解時,使用 map<long long, int> 來存儲每個質因數及其出現的次數(指數)5,是 map 在數論問題中進行頻次統計的典型應用。(來自您提供的文件)
//33-1 (第33次第一題)
//構建兩個map來映射,也可以吧兩個合成一個map<int,vector<int>>來操作,但我覺得沒必要#include <iostream>
#include <map>
#include <vector>using namespace std;int main(){int m,n;cin >> n >> m;map<int,int> freq;map<int,int> arti;for(int i=1;i<=m;i++){freq.insert(make_pair(i,0));arti.insert(make_pair(i,0));}while(n--){int a;cin >> a;vector<bool> vis(m,false);for(int i=0;i<a;i++){int tmp;cin >> tmp;freq[tmp]++;if(!vis[tmp]){arti[tmp]++;vis[tmp] = true;}}}for(int i=1;i<=m;i++){cout << arti[i] << " " << freq[i] <<"\n";}return 0;
}``````cpp
//30-1 直接無腦把各種情況往映射里面插入就行。#include <iostream>
#include <vector>
#include <map>  
#include <string>using namespace std;int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin >> n;map<vector<string>,int> freq;for(int i=0;i<n;i++){vector<string> situ(8);for(int j=0;j<8;j++){cin >> situ[j];}if(freq.find(situ)==freq.end()){freq[situ]=1;}else{freq[situ]++;}cout << freq[situ] <<"\n";}return 0;
}
//19-2 寫兩個map,數據傳入后直接乘#include <iostream>
#include <vector>
#include <map>  
#include <string>using namespace std;int main(){int n,a,b;cin >> n >> a >> b;map<int,int> vc1;map<int,int> vc2;for(int i=0;i<a;i++){int tmp;cin >> tmp;cin >> vc1[tmp];}for(int i=0;i<b;i++){int tmp;cin >> tmp;cin >> vc2[tmp];}long long sum=0;// 遍歷第一個向量中的所有索引for(auto& p : vc1){int index = p.first;if(vc2.find(index) != vc2.end()){sum += (long long)p.second * vc2[index];}}cout << sum << "\n";return 0;
}
//素數我直接打表的,注意一個可能本身是大數的情況,所以加了一步flag#include <iostream>
#include <vector>
#include <map>  
#include <string>
#include <sstream>
#include <math.h>std::vector<int> pri={2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,701,709,719,727,733,739,743,751,757,761,769,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};
using namespace std;int main(){int n;cin >> n;while(n--){long long a;int k;map<int,int> freq;cin >> a >> k;while(a>1){bool flag = false;for(int i=0;i<pri.size()&&a>=pri[i];i++){if(a%pri[i]==0){if(freq.find(pri[i])==freq.end()){freq[pri[i]]=1;}elsefreq[pri[i]]++;a/=pri[i];flag = true;break;}}if(!flag){if(freq.find(a)==freq.end())freq[a]=1;elsefreq[a]++;break;}}long long b = 1;for(auto& p : freq){if(p.second>=k){b *= pow(p.first,p.second) ;}}cout << b << "\n";}return 0;
}

練習建議:

  • CCF202403-1 (詞頻統計) 是必做題,它完美地體現了CCF對 map 基本能力的考察。請務必掌握 map[key]++ 這種簡潔的計數方式。

  • CCF202305-1 (重復局面) 時,關鍵在于理解C++中 map 的鍵只要是可比較的,就可以是任意復雜類型。這為你解決更多樣的問題打開了思路。

  • CCF202006-2 (稀疏向量) 時,需要遍歷其中一個 map,然后用 findcount 方法在另一個 map 中查找是否存在相同的 key(維度下標),從而計算內積。


第二部分:set 的應用——去重與查找 (約 1.5 小時)

set 容器存儲的元素都是唯一的,并且會自動排序。它非常適合需要去除重復元素,或者需要快速判斷某個元素是否在集合中的場景。

題目編號題目名稱核心知識點練習目標
P1059[NOIP2006 普及組] 明明的隨機數set最經典的去重入門題。將所有數字插入 set 容器,它會自動完成去重和排序,是理解 set 核心特性的不二之選。
CCF202403-2相似度計算set, string題目核心是“去掉各自重復的單詞”并計算交集與并集 6。這是 set 數據結構的教科書式應用,用于高效地進行字符串去重和集合運算。(來自您提供的文件)
P3370【模板】字符串哈希set<string>統計一堆字符串中有多少個不同的字符串。可以直接使用 std::set<string> 來自動去重并計數,是 set 用于字符串去重的模板題。
P1540[NOIP2010 提高組] 機器翻譯set/map, queue模擬內存緩存。需要一個數據結構能快速判斷某單詞是否存在于內存中,setfindcount 方法非常適合這個場景。
P1059 -這個題目我在排序和二分那里用set做了一遍
//33-2 兩個點:大小寫轉換記得用引用;這里用無序容器更好,因為基于哈希的無序容器查找耗時O(1)#include <iostream>
#include <set>
#include <string>using namespace std;int main(){int a,b;cin >> a >> b;set<string> s1;set<string> s2;for(int i=0;i<a;i++){string tmp;cin >> tmp;for(char &c : tmp){c = tolower(c);}s1.insert(tmp);}for(int i=0;i<b;i++){string tmp;cin >> tmp;for(char &c : tmp){c = tolower(c);}s2.insert(tmp);}set<string> s3;for(auto& p : s1){if(s2.find(p)!=s2.end()){s3.insert(p);}}cout << s3.size() << endl << s1.size()+s2.size()-s3.size() << endl;return 0;
}
//P3370 - 題目想要你自己搞哈希,既然有現成容器直接用就行#include <iostream>
#include <set>
#include <string>using namespace std;int main(){int n;cin >> n;set<string> s;while(n--){string tmp;cin >> tmp;s.insert(tmp);}cout << s.size() << endl;return 0;
}
//P1540 - 我這里了個queue來進行內存里面數據的處理(先進先出),因為刪除set里面東西的時候只能找key,愿意的話可以用u_map然后把key順序一下,每次刪最前面就行。(我覺不如queue實在)#include <iostream>
#include <unordered_set>
#include <string>
#include <deque>using namespace std;int main(){int m,n;int rst=0;cin >> m >> n;unordered_set<int> s;deque<int> q;while(n--){int i;cin >> i;if(s.find(i)==s.end()){s.insert(i);q.push_back(i);rst++;if(q.size()>m){s.erase(q.front());q.pop_front();}}}cout << rst << endl;return 0;
}

練習建議:

  • P1059CCF202403-2 是必做題,它們分別代表了對數字和字符串的去重,覆蓋了 set 最核心的應用。

  • 在做 CCF202403-2 (相似度計算) 時,在將兩個單詞集合(set)構建好之后,可以通過遍歷較小的集合,并使用 find 方法在較大的集合中查找,來高效地計算交集的大小。

  • P1540 是一個很好的綜合題,它會讓你思考 set 只負責去重和查找,但不記錄順序,因此需要結合 queue等其他數據結構來記錄元素的進入次序。


目標達成自查 (約 0.5 小時)

完成以上練習后,進行復盤和總結:

  1. 關于 map vs 數組:

    • 在什么情況下必須使用 map 而不能用數組?(當鍵的類型不是整數,或者鍵是整數但范圍非常大且分布稀疏時)

    • mapm[key]++ 操作包含了哪些步驟?(查找 key,如果不存在則插入默認值0,然后自增)

  2. 關于 set vs vector+sort+unique:

    • 使用 set 去重和使用 vector 排序去重各有什么優缺點?(set 插入時自動維護,代碼簡單;vector 操作對于靜態數據一次性處理速度可能更快)

    • 如何用 set 快速判斷一個元素是否存在?(使用 s.count(element)s.find(element) != s.end(),時間復雜度為 O(log n))

  3. 復雜度意識:

    • mapset 中一次插入、刪除、查找操作的平均時間復雜度是多少?(O(log n))

    • 對于 10^5 級別的數據量,使用 mapset 的總時間復雜度大約是多少?(O(n log n)),這在絕大多數算法競賽中是可以接受的。

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

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

相關文章

【智譜清言-GLM-4.5】StackCube-v1 任務訓練結果不穩定性的分析

1. Prompt 我是機器人RL方向的博士生正在學習ManiSkill&#xff0c;在學習時我嘗試使用相同命令訓練同一個任務&#xff0c;但是我發現最終的 success_once 指標并不是相同的&#xff0c;我感到十分焦慮&#xff0c; 我使用的命令如下&#xff1a; python sac.py --env_id&qu…

MySQL 8.0 主從復制原理分析與實戰

MySQL 8.0 主從復制原理分析與實戰半同步復制設計理念&#xff1a;復制狀態機——幾乎所有的分布式存儲都是這么復制數據的基于全局事務標識符&#xff08;GTID&#xff09;復制GTID工作原理多主模式多主模式部署示例課程目標&#xff1a; MySQL 復制&#xff08;Replication&a…

[UT]記錄case中seq.start(sequencer)的位置變化帶來的執行行為的變化

現象&#xff1a; 代碼選擇打開57行&#xff0c;注釋掉60行執行&#xff0c;結果58行不會打印。 代碼選擇打開60行&#xff0c;注釋57行執行&#xff0c;結果58行正常打印。 sequence的執行需要時間&#xff01;&#xff01;&#xff01; SV中代碼57行切換到60行的區別&#xf…

利用keytool實現https協議(生成自簽名證書)

利用keytool實現https協議&#xff08;生成自簽名證書&#xff09;什么是https協議&#xff1f;https&#xff08;安全超文本傳輸協議&#xff09;是 HTTP 的安全版本&#xff0c;通過 SSL/TLS 加密技術&#xff0c;在客戶端&#xff08;如瀏覽器&#xff09;和服務器之間建立加…

拆解 AI 大模型 “思考” 邏輯:從參數訓練到語義理解的核心鏈路

一、引言&#xff1a;揭開 AI 大模型 “思考” 的神秘面紗?日常生活中的 AI 大模型 “思考” 場景呈現&#xff08;如 ChatGPT 對話、AI 寫作輔助、智能客服應答&#xff09;?提出核心問題&#xff1a;看似具備 “思考” 能力的 AI 大模型&#xff0c;其背后的運作邏輯究竟是…

element plus 使用細節 (二)

接上一篇文章&#xff1a; element plus 使用細節 最近菜鳥忙于系統開發&#xff0c;都沒時間總結項目中使用的問題&#xff0c;幸好還是在空閑之余總結了一點&#xff08;后續也會來補充&#xff09;&#xff0c;希望能給大家帶來幫助&#xff01; 文章目錄table fixed 的 v…

【機器學習學習筆記】numpy基礎2

零基礎小白的 NumPy 入門指南如果你想用電競&#xff08;打游戲&#xff09;的思路理解編程&#xff1a;Python 是基礎操作鍵位&#xff0c;而 NumPy 就是 “英雄專屬技能包”—— 專門幫你搞定 “數值計算” 這類復雜任務&#xff0c;比如算游戲里的傷害公式、地圖坐標&#x…

從自動化到智能化:家具廠智能化產線需求與解決方案解析

伴隨著工業4.0浪潮和智能制造技術的成熟&#xff0c;家具行業正逐步從傳統的自動化生產邁向智能化生產。智能化產線的構建不僅可以提升生產效率&#xff0c;還能滿足個性化定制和柔性制造的需求。本文以某家具廠為例&#xff0c;詳細解析智能化產線的核心需求&#xff0c;并提出…

macOS下基于Qt/C++的OpenGL開發環境的搭建

系統配置 MacBook Pro 2015 Intel macOS 12Xcode 14 Qt開發環境搭建 Qt Creator的下載與安裝 在Qt官網的下載頁面上下載&#xff0c;即Download Qt Online Installer for macOS。下載完成就得到一個文件名類似于qt-online-installer-macOS-x64-x.y.z.dmg的安裝包。 下一步 …

當液態玻璃計劃遭遇反叛者:一場 iOS 26 界面的暗戰

引子 在硅谷的地下代碼俱樂部里&#xff0c;流傳著一個關于 “液態玻璃” 的傳說 —— 那是 Apple 秘密研發的界面改造計劃&#xff0c;如同電影《變臉》中那張能改變命運的面具&#xff0c;一旦啟用&#xff0c;所有 App 都將被迫換上流光溢彩的新面孔。 而今天&#xff0c;我…

探究Linux系統的SSL/TLS證書機制

一、SSL/TLS證書的基本概念 1.1 SSL/TLS協議簡介 SSL/TLS是一種加密協議&#xff0c;旨在為網絡通信提供機密性、完整性和身份驗證。它廣泛應用于HTTPS網站、電子郵件服務、VPN以及其他需要安全通信的場景。SSL&#xff08;安全套接字層&#xff09;是TLS&#xff08;傳輸層安全…

python和java爬蟲優劣對比

Python和Java作為爬蟲開發的兩大主流語言&#xff0c;核心差異源于語法特性、生態工具鏈、性能表現的不同&#xff0c;其優勢與劣勢需結合具體場景&#xff08;如開發效率、爬取規模、反爬復雜度&#xff09;判斷。以下從 優勢、劣勢、適用場景 三個維度展開對比&#xff0c;幫…

Unity 槍械紅點瞄準器計算

今天突然別人問我紅點瞄準器在鏡子上如何計算&#xff0c;之前的吃雞項目做過不記得&#xff0c;今天寫個小用例整理下。 主體思想記得是目標位置到眼睛穿過紅點瞄準器獲取當前點的位置就可以。應該是這樣吧&#xff0c;&#xff1a;&#xff09; 武器測試結構 首先整個結構&am…

題解 洛谷P13778 「o.OI R2」=+#-

文章目錄題解代碼居然沒有題解&#xff1f;我來寫一下我的抽象做法。 題解 手玩一下&#xff0c;隨便畫個他信心的折線圖&#xff0c;如下&#xff1a; 可以發現&#xff0c;如果我們知道終止節點&#xff0c;那么我們就可以知道中間有多少個上升長度。&#xff08;因為它只能…

RTSP流端口占用詳解:TCP模式與UDP模式的對比

在音視頻傳輸協議中&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff0c;實時流傳輸協議&#xff09;被廣泛用于點播、直播、監控等場景。開發者在實際部署或調試時&#xff0c;常常會遇到一個問題&#xff1a;一路 RTSP 流到底占用多少個端口&#xff1f; 這…

websocket的key和accept分別是多少個字節

WebSocket的Sec-WebSocket-Key是24字節&#xff08;192位&#xff09;的Base64編碼字符串&#xff0c;解碼后為16字節&#xff08;128位&#xff09;的原始隨機數據&#xff1b;Sec-WebSocket-Accept是28字節&#xff08;224位&#xff09;的Base64編碼字符串&#xff0c;解碼后…

單片機開發----一個簡單的Boot

文章目錄一、設計思路**整體框架設計****各文件/模塊功能解析**1. main.c&#xff08;主程序入口&#xff0c;核心控制&#xff09;2. 隱含的核心模塊&#xff08;框架中未展示但必備&#xff09;**設計亮點**二、代碼bootloader.hbootloader.cflash.cmain.c一、設計思路 整體…

Day2p2 夏暮客的Python之路

day2p2 The Hard Way to learn Python 文章目錄day2p2 The Hard Way to learn Python前言一、提問和提示1.1 關于raw_input()1.2 關于input()二、參數、解包、變量2.1 解讀參數2.2 解讀解包2.3 解讀變量2.4 實例2.5 模塊和功能2.6 練習前言 author&#xff1a;SummerEnd date…

【C++設計模式】第二篇:策略模式(Strategy)--從基本介紹,內部原理、應用場景、使用方法,常見問題和解決方案進行深度解析

C設計模式系列文章目錄 【第一篇】C單例模式–懶漢與餓漢以及線程安全 【C設計模式】第二篇&#xff1a;策略模式&#xff08;Strategy&#xff09;--從基本介紹&#xff0c;內部原理、應用場景、使用方法&#xff0c;常見問題和解決方案進行深度解析一、策略模式的基本介紹1.…

四十歲編程:熱愛、沉淀與行業的真相-優雅草卓伊凡

四十歲編程&#xff1a;熱愛、沉淀與行業的真相-優雅草卓伊凡今日卓伊凡收到一個問題&#xff1a;「如何看待40歲還在擼代碼的程序員&#xff1f;」這讓我不禁思考&#xff1a;從何時起&#xff0c;年齡成了程序員職業中的敏感詞&#xff1f;在互聯網的某些角落&#xff0c;彌漫…