C++學習筆記:set和map

set和map

  • set
    • 什么是set
    • set的使用
  • 關聯式容器
    • 鍵值對
  • map
    • 什么是map
    • map的使用
      • map的插入方式
      • 常用功能
      • map[] 的靈活使用

set

什么是set

set是STL中一個底層為二叉搜索樹來實現的容器

  • 若要使用set需要包含頭文件 #include<set>
  • set中的元素具有唯一性(因此可以用set去重)
  • 若用set的迭代器遍歷,默認得到升序序列
  • set查找某個元素默認復雜度為 l o g 2 N log_2 N log2?N
  • set中的元素不能被修改

set的使用

set<int> s; //默認升序
set<int , greater<int>>  us; //降序
int i;s.insert(i);  //插入值 若成功,則返回i所在迭代器,若失敗,則返回已存在的i的迭代器s.erase(i);  //刪除某個值 并 返回所刪除的個數s.clear();  //清空ss.begin();  //begin迭代器s.end();  //end()迭代器s.find(i);  //查找i,若找到了,則返回i的迭代器,若沒找到,返回尾部迭代器 s.end();s.empty();  //返回s是否為空s.size();  //返回s內元素個數

用例:

#include<iostream>
#include<set>using namespace std;int main()
{set<int> s;s.insert(1);s.insert(3);s.insert(2);s.insert(4);s.insert(5);s.insert(1);  //插入第二個1//這里用了范圍for ,因為右迭代器,因此自動遍歷for (auto& e : s){cout << e << " ";}cout << endl;   //遍歷結果: 1 2 3 4 5//刪除3再遍歷  set會自動調整s.erase(3);for (auto& e : s){cout << e << " ";}cout << endl;   //遍歷結果: 1 2 4 5//清理ss.clear();for (auto& e : s){cout << e << " ";}cout << endl; //空值set<int, greater<int>>  us; //降序set//插入:us.insert(1);us.insert(2);us.insert(3);us.insert(4);us.insert(5);//遍歷for (auto& e : us){cout << e << " ";}cout << endl;  //遍歷結果為降序: 5 4 3 2 1return 0;
}

在這里插入圖片描述

關聯式容器

之前學習的容器中,基本都是單元素存儲,比如:vector、list、deque、等,這些容器統稱為序列式容器,因為其底層為線性序列的數據結構,里面存儲的是元素本身。即 K 模型 的容器
關聯式容器也是用來存儲數據的,與序列式容器不同的是,其里面存儲的是<key, value>結構的鍵值對,在數據檢索時比序列式容器效率更高
例如上面的set也是關聯式容器,set中只放value,但在底層實際存放的是由<value, value>構成的鍵值對

鍵值對

用來表示具有一一對應關系的一種結構,該結構中一般只包含兩個成員變量key和value,key代表鍵值,value表示與key對應的信息.即 KV 模型 的容器
在這里插入圖片描述

STL中鍵值對的定義:

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

map

什么是map

一種存儲鍵值對,底層為二叉搜索樹的數據結構

  • 需要包含頭文件#include<map>
  • map是關聯容器,它按照特定的次序(按照key來比較)存儲由鍵值key和值value組合而成的元素。即 KV 模型
  • 在map中,鍵值key通常用于排序和惟一地標識元素,而值value中存儲與此鍵值key關聯的內容。鍵值key和值value的類型可能不同,并且在map的內部,key與value通過成員類型value_type綁定在一起,為其取別名稱為pair:
    typedef pair<const key, T> value_type 其中,key為const,因此是不能修改的,而T是可以修改的
  • map中的元素按照鍵值key進行比較排序
  • map支持下標訪問,即在[]中放入key,就可以找到與key對應的value。
  • map底層實際上就是二叉搜索樹(更準確的說:平衡二叉搜索樹(紅黑樹))。

map的使用

先創建一個map對象:

map<string, string> m;

map的插入方式

幾種常見的map插入方式:

    m.insert(make_pair("left", "左邊"));m.insert(pair<string, string>("right", "右邊"));m["insert"] = "插入";
  1. 因為map中存儲的是鍵值對元素,因此每次插入的時候應該使用pair函數
    m.insert(pair<string, string>("right", "右邊"));
    但是這種方法有點麻煩,因此引用了make_pair函數

  2. make_pair是一個仿函數,定義如下:
    返回值還是一個pair鍵值對:
    在這里插入圖片描述
    因此當map插入值的時候可以使用以下方法:
    m.insert(make_pair("left", "左邊"));
    這種方式是最常用的

  3. 因為map重載了[],因此可以直接使用[]來進行插入
    map中operator[]的原理是:

  • 用<key, T()>構造一個鍵值對,然后調用insert()函數將該鍵值對插入到map中
  • 如果key已經存在,插入失敗,insert函數返回該key所在位置的迭代器
  • 如果key不存在,插入成功,insert函數返回新插入元素所在位置的迭代器
  • operator[]函數最后將insert返回值鍵值對中的value返回
    m["insert"] = "插入";
    其中,[]內為 K 值, 返回的V被 = 后的內容賦值;

常用功能

    m.insert(make_pair("erase", "刪除"));  //插入值 若已存在,則返回該值的迭代器m.erase("erase");  //刪除值m.clear();  //清除mapm.size();  //返回 K 元素的數量m.begin();  //begin迭代器m.end();  //end迭代器m.find("erase");  //查找 K 值,若找到了,則返回迭代器, 若沒找到,則返回迭代器m.end()m["find"];  //插入K ,若有m.swap(m2);  //交換兩個map對象 其中m2 為另一個與m對象同類型的對象

map[] 的靈活使用

map因為重載了[] ,因此變得非常靈活,例如,統計下列數組中相同的值出現的次數:

#include<iostream>
#include<string>
#include<map>using namespace std;int main()
{string arr[] = { "西瓜","西瓜", "西瓜", "西瓜","蘋果","蘋果","蘋果","蘋果","蘋果","蘋果","香蕉","香蕉","香蕉","香蕉","草莓","草莓","草莓","草莓","草莓","草莓","草莓", };map<string, int> m;for (auto& e : arr){m[e]++; //這里直接利用[]對m進行插入,并通過++ 對V值進行控制}for (auto& e : m){cout << e.first << ":" << e.second << endl;}return 0;
}

輸出結果:
在這里插入圖片描述

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

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

相關文章

【java-面試題】start和run的區別

【java-面試題】start和run的區別 在run方法內部&#xff0c;只是單純的描述了該線程要執行的內容。run方法是線程的入口。 在start方法內部&#xff0c;會調用到系統api&#xff0c;從而在系統內核中創建出線程&#xff0c;創建線程后&#xff0c;再自動調用run方法。 在代碼…

掌握未來技術:一站式深度學習學習平臺體驗!

介紹&#xff1a;深度學習是機器學習的一個子領域&#xff0c;它模仿人腦的分析和學習能力&#xff0c;通過構建和訓練多層神經網絡來學習數據的內在規律和表示層次。 深度學習的核心在于能夠自動學習數據中的高層次特征&#xff0c;而無需人工進行復雜的特征工程。這種方法在圖…

大模型筆記:RAG(Retrieval Augmented Generation,檢索增強生成)

1 大模型知識更新的困境 大模型的知識更新是很困難的&#xff0c;主要原因在于&#xff1a; 訓練數據集固定,一旦訓練完成就很難再通過繼續訓練來更新其知識參數量巨大,隨時進行fine-tuning需要消耗大量的資源&#xff0c;并且需要相當長的時間LLM的知識是編碼在數百億個參數中…

格式規范性知識的探究式學習

對于格式規范性這種規定性的知識&#xff0c;可以采用“增刪改”的方式進行控究式學習。 #include<stdio.h>int main(){printf("%.1f\n", 8.0/5.0);return 0;} 這個printf語句分兩部分&#xff0c;本身的功能就是格式化輸出&#xff0c;因此參數完全是格式化…

一些C語言知識

C語言的內置類型&#xff1a; char short int long float double C99中引入了bool類型&#xff0c;用來表示真假的變量類型&#xff0c;包含true&#xff0c;false。 這個代碼的執行結果是什么&#xff1f;好好想想哦&#xff0c;坑挺多的。 #include <stdio.h>int mai…

STM32(5) GPIO(2)輸出

1.點亮LED 1.1 推挽接法和開漏接法 要想點亮LED&#xff0c;有兩種接法 推挽接法&#xff1a; 向寄存器寫1&#xff0c;引腳輸出高電平&#xff0c;LED點亮&#xff1b;向寄存器寫0&#xff0c;引腳輸出低電平&#xff0c;LED熄滅。 開漏接法&#xff1a; 向寄存器寫0&…

Kubernetes operator 前置知識篇

云原生學習路線導航頁&#xff08;持續更新中&#xff09; 本文是 Kubernetes operator學習 系列的前置知識篇&#xff0c;幫助大家對 Operator 進行初步了解Kubernetes operator學習系列 快捷鏈接 Kubernetes operator 前置知識篇Kubernetes operator&#xff08;一&#xff0…

《精益DevOps》:填補IT服務交付的認知差距,實現高效可靠的客戶期望滿足

寫在前面 在當今的商業環境中&#xff0c;IT服務交付已經成為企業成功的關鍵因素之一。然而&#xff0c;實現高效、可靠、安全且符合客戶期望的IT服務交付卻是一項艱巨的任務。這要求服務提供商不僅具備先進的技術能力&#xff0c;還需要擁有出色的組織協作、流程管理和態勢感…

UniApp項目處理小程序分包

目前 uniApp也成為一種 App端開發的大趨勢 因為在目前跨端 uniApp可以說相當優秀 可以同時兼容 H5 PC 小程序 APP 的技術 目前市場屈指可數 那么 說到微信小程序 自然就要處理分包 因為微信小程序對應用大小限制非常銘感 限制在2MB 超過之后就會無法真機調試與打包 不過需要注…

快速排序C語言代碼實現(2)

#include<stdio.h> void quick_sort(int arr[], int left, int right) {if (left < right) {int i left, j right, pivot arr[i];while (i < j) {while (i<j&&arr[j]>pivot) {//此時判斷使用i<j的目的是為了最終的目標位置是ij時的位置j--;}if…

vue項目中使用antvX6新手教程,附demo案例講解(可拖拽流程圖、網絡拓撲圖)

前言&#xff1a; 之前分別做了vue2和vue3項目里的網絡拓撲圖功能&#xff0c;發現對antv X6的講解博客比較少&#xff0c;最近終于得閑碼一篇了&#xff01; 需求&#xff1a; 用戶可以自己拖拽節點&#xff0c;節點之間可以隨意連線&#xff0c;保存拓撲圖數據后傳給后端&…

cPanel面板安裝付費的SSL證書

前不久遇到購買Hostease服務器的客戶反饋需要安裝SSL證書。因為安裝 SSL 證書不僅可以保護用戶數據安全&#xff0c;增加用戶信任度&#xff0c;提升搜索引擎排名&#xff0c;還有助于符合法規和標準&#xff0c;防止網絡攻擊。 安裝SSL證書可以通過如下步驟: 1. 選擇 SSL 證書…

數學建模【多元線性回歸模型】

一、多元線性回歸模型簡介 回歸分析是數據分析中最基礎也是最重要的分析工具&#xff0c;絕大多數的數據分析問題&#xff0c;都可以使用回歸的思想來解決。回歸分析的任務就是&#xff0c;通過研究自變量X和因變量Y的相關關系&#xff0c;嘗試去解釋Y的形成機制&#xff0c;進…

Linux配置網卡功能

提示:工具下載鏈接在文章最后 目錄 一.network功能介紹二.配置network功能2.1 network_ip配置檢查 2.2 network_br配置2.2.1 配置的網橋原先不存在檢查2.2.2 配置的網橋已存在-修改網橋IP檢查2.2.3 配置的網橋已存在-只添加網卡到網橋里檢查 2.3 network_bond配置檢查 2.4 netw…

Access AR Foundation 5.1 in Unity 2022

如果已經下載安裝了ARF但版本是5.0.7 可以通過下面的方式修改 修改后面的數字會自動更新 更新完成后查看版本 官方文檔 Access AR Foundation 5.1 in Unity 2021 | AR Foundation | 5.1.2

【知識整理】Git 使用實踐問題整理

問題1、fatal: refusing to merge unrelated histories 一、Git 的報錯 fatal: refusing to merge unrelated histories 新建了一個倉庫之后&#xff0c;把本地倉庫進行關聯提交、拉取的時候&#xff0c;出現了如下錯誤&#xff1a; fatal: master does not appear to be a g…

js原型原型鏈

js原型原型鏈 在 JavaScript 中&#xff0c;每個對象都有一個原型&#xff08;prototype&#xff09;。對象的原型是另一個對象的引用&#xff0c;它包含對象的共享屬性和方法。JavaScript 中的原型鏈則是對象之間通過原型鏈接起來的一種機制&#xff0c;用于實現繼承和屬性查找…

電腦無法開啟虛擬化

vm開啟虛擬化失敗 如果出現以下錯誤&#xff0c;需要進入bios界面&#xff0c;不同電腦進入界面的方式不一樣。這里以hp為例&#xff1a; 1、關機后&#xff0c;按住開機鍵和f10&#xff0c;進入如下界面&#xff08;語言在主菜單里面&#xff09; 2、選擇先進和下面的系統選…

c語言游戲實戰(10):坤坤的籃球回避秀

前言&#xff1a; 這款簡易版的球球大作戰是博主耗時兩天半完成的&#xff0c;玩家需要控制坤坤在游戲界面上移動&#xff0c;來躲避游戲界面上方不斷掉下來的籃球。本游戲使用C語言和easyx圖形庫編寫&#xff0c;旨在幫助初學者了解游戲開發的基本概念和技巧。 在開始編寫代…

Vue使用高德地圖定位到當前位置,并顯示天氣信息

首先得去高德控制臺申請兩個 key&#xff0c;一個天氣key和一個定位key 獲取天氣信息的函數&#xff1a; const getWeather function (city) {// 使用 fetch 發送請求獲取天氣信息fetch(https://restapi.amap.com/v3/weather/weatherInfo?city${city}&keyeefd36557b0250…