STL容器及其簡單應用(stack、priority_queue、vector、deuqe、list、map/multimap、set/multiset)

目錄

  • 前言
  • 【1】stack操作以及應用
    • stack的幾個核心接口
    • 利用stack完成進制轉換
  • 【2】priority_queue操作以及應用
    • priority_queue的幾個核心接口
    • 利用priority_queue完成合并果子問題
  • 【3】vector操作以及應用
    • vector的幾個核心接口
    • 利用vector完成隨機排序
  • 【4】deuqe(雙向隊列)操作以及應用
    • deuqe的特點以及核心接口
    • 利用deuqe處理數據
  • 【5】list(雙向鏈表)操作以及應用
    • list的特點
    • 雙向鏈表實現數據的輸入與求和
  • 【6】map/multimap操作以及應用
    • map/multimap的幾個特點以及功能接口
    • map/multimap應用:優惠購物
  • 【7】set/multiset(集合/多重集合)操作以及應用
    • set/multiset的幾個特點
    • 利用set完成隨機數的產生以及排序
  • 總結


前言

前幾天回老家沒事兒在新華書店乘涼,無意翻到《c++信息學奧林匹克競賽入門與提高》,拍了幾張照片,順便學點c++的知識。
現整理如下:
關于STL的知識可以先看看百度百科:STL(模板庫)_百度百科


【1】stack操作以及應用

stack的幾個核心接口

向棧中壓入一個元素(push)、
取棧頂元素的值(top)、
彈出棧頂元素(pop)、
清空棧(empty)、
判斷棧是否為空(isEmpty)

利用stack完成進制轉換

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
using namespace std;//stack應用
//輸入:十進制數n,轉換成r進制數輸出(2<=r<=16)
const string t = "0123456789ABCDEF";
int main()
{stack<int>s;int n, r, x;cin >> n >> r;while (n != 0){x = n % r;//求余數s.push(x);//將余數壓入棧頂n = n / r;//縮小r倍}while (!s.empty()){cout << t[s.top()];	//轉換成r進制數位s.pop();	//彈出棧頂元素,即移除元素}
}

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

【2】priority_queue操作以及應用

priority_queue的幾個核心接口

push()——根據元素的優先級將元素置入優先隊列(默認降序排列,大值優先)
top()——返回優先隊列頭部最大的元素的引用(不移除
pop()——從優先隊列中移除最大元素
empty()——優先隊列是否為空

priority_queue 的模板聲明帶有三個參數:
priority_queue<Type, Container, Functional>
其中Type 為數據類型, Container 為保存數據的容器,Functional 為元素比較方式。
Container 必須是用數組實現的容器,比如 vector, deque 但不能用 list.
STL里面默認用的是 vector. 比較方式默認用 operator< , 所以如果你把后面倆個參數缺省的話,
優先隊列就是大頂堆,隊頭元素最大。

利用priority_queue完成合并果子問題

問題描述以及分析:
在一個果園里,多多已經將所有的果子打了下來,而且按果子的不同種類分成了不同的堆。多多決定把
所有的果子合成一堆。每一次合并,多多可以把兩堆果子合并到一起,消耗的體力等于兩堆果子的重力之和。
算法分析:
如有3種果子,數目依次為1,9,2。可以先將1,2堆合并,新堆數目為3,耗費體力為3。接著﹐將新堆
與數量為9的堆合并,又得到新的堆,數目為12,耗費體力為12。
所以多多總共耗費體力=3+12=15。可以證明15為最小的體力耗費值。
類似于堆操作(完全二叉樹),優先級高的優先處理

代碼實現:

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
using namespace std;
//最小值優先(升序處理)使用動態數組vector遞增參數排序,相當于最小值優先
priority_queue<int, vector<int>, greater<int> > q;
//從小到大的優先級隊列,可將greater改為less,即為從大到小,
int main()
{int i, n, ans = 0, t1 = 0, t2 = 0, t3 = 0, x;cin >> n;for (i=0;i<n;i++){cin >> x;	q.push(x);	//進隊,把一個元素壓入隊尾}//所有元素壓入隊列中之后自動排序for (i = n;i > 1;i--)	//合并次數共計n-1次{t1 = q.top();		//取最小的元素q.pop();			//此元素出隊列t2 = q.top();		//取第二小的元素q.pop();			//此元素出隊列t3 = t1 + t2;		//合并果子數(合并較小的2個)ans +=t3;			//求果子數目之和q.push(t3);			//入隊列//每一次循環,都會自動排序}cout << ans << endl;return 0;
}

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

【3】vector操作以及應用

vector的幾個核心接口

常用操作效果
vectorc產生一個空的vetcor
c.size()返回元素個數
front()返回第一個元素的引用,不檢查元素是否存在
back()返回最后一個元素的引用,不檢查元素是否存在
begin()返回一個迭代器,指向第一個元素
end()返回一個迭代器,指向最后一個元素之后
c.insert(pos,e)在pos位置插入元素e的副本,并返回新元素的位置
c.push_back(e)在尾部添加一個元素e的副本
c.pop_back(e)移除最后一個元素但不返回最后一個元素
c.erase(pos)刪除pos位置的元素,返回下一個元素的位置
c.clear()移除所有元素,清空容器

利用vector完成隨機排序

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
#include <time.h>
using namespace std;
void Swap(int& a, int& b)
{int c = a;a = b;b = c;
}
void random_arrange(int a[], int len)
{int i;srand(time(NULL));for (i = 0; i < len; i++){Swap(a[i], a[rand() % (i + 1)]);}
}void print(int a[], int len)
{for (int i = 0; i < len; i++)cout << a[i] << "  ";cout << endl;
}int main(void)
{int a[] = { 1,2,3,4,5,6,7,8,9 };int len = sizeof(a) / sizeof(int);int i = 0;cout << "before arrange" << endl;print(a, len);//random_arrange(a, len);vector<int> se;			//這里的vector要是換成set會報錯while (se.size() < len)se.push_back(a[i++]);random_shuffle(se.begin(), se.end());cout << "after arrange" << endl;for (i = 0; i < len; i++)cout << se[i] << "  ";cout << endl;return 0;
}

效果:
在這里插入圖片描述

【4】deuqe(雙向隊列)操作以及應用

deque(雙向隊列)和vector非常相似,操作接口功能模塊基本一致。它采用動態數組來管理元素,提供隨機存取,可以在頭尾兩段快速插入和刪除元素。

deuqe的特點以及核心接口

deque支持隨機存取,可以使用迭代器或[ ]符號
deque支持在頭部和尾部存儲數據

操作效果
c,push_back(e)在尾部添加一個元素e的副本
c.push_front(e)在頭部添加一個元素e的副本
c.pop_back()移除最后一個元素但不返回最后一個元素
c.pop_front()移除第一個元素但不返回第一個元素

利用deuqe處理數據

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
#include <time.h>using namespace std;int main()
{//deque(int nSize,const T& t):創建一個deque,元素個數為nSize,且值均為tdeque< int>d(10, 1);deque< int>::iterator it;int x, y;cin >> x >> y;d.push_front(y);d.push_back(x);cout << "d[0]=" << d[0] << endl;cout << "d[11]=" << d[11] << endl;cout << "d.front()=" << d.front() << endl;cout << "d.back()=" << d.back() << endl;for (it = d.begin();it != d.end();it++){cout << *it << " ";}cout << endl;return 0;
}

在這里插入圖片描述

【5】list(雙向鏈表)操作以及應用

list的特點

雙向鏈表將元素按順序存儲在鏈表中。與動態數組vector相比,它允許快速地插入與刪除,但是隨機訪問卻比較慢。
特點:

使用雙向鏈表管理元素,數據元素可以使任意類型T
list只能通過迭代器遍歷數據(不支持隨機存取,不能使用[ ])
在任何位置上執行元素的插入和移除都非常快

雙向鏈表實現數據的輸入與求和

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <string> 
#include <cstring> 
#include <list> 
#include<numeric>using namespace std;
list<int>list1;
int main()
{list<int>::iterator iter;//從雙向鏈表list1前面向容器中添加數據list1.push_front(5);list1.push_front(8);//從雙向鏈表list1后面向容器中添加數據list1.push_back(7);list1.push_back(9);//從前向后顯示list1中的數據cout << "list1 data" << endl;for (iter = list1.begin();iter != list1.end();iter++){cout << *iter << " ";}cout << endl;//求和int result = accumulate(list1.begin(),list1.end(),0);cout << "Sum" << result << endl;return 0;
}

在這里插入圖片描述

【6】map/multimap操作以及應用

map是STL關聯式容器,它提供映射關系(第一個關鍵字,第二個關鍵值)的數據處理能力,通常用它來快速處理映射相關的數據集,map數據結構內部是一棵紅黑樹(平衡二叉樹),它具有對數據自動排序的功能,我們可以快速高效處理容器中的數據,時間復雜度為logN。對于訪問的迭代器來說,僅能修改關鍵值,不能修改key。

map/multimap的幾個特點以及功能接口

元素包含兩部分(key,value),key和value可以是任意類型
根據元素的key自動對元素排序,因此根據元素的key可以進行很快定位
不能直接改變元素的key,可以通過[ ]直接存取元素值
map中不允許key相同的元素,multimap允許key相同的元素

操作效果
map.c產生空的map
c.size()返回元素個數
count(key)返回鍵值==key的元素個數
find(key)返回鍵值==key 的第一個元素,找不到的話返回end
lower_bound(key)返回鍵值>=key的第一個元素
upper_bound(key)返回鍵值>key的第一個元素
equal_range(key)返回鍵值==key的元素區間
c.insert(pos,e)在pos位置為起點插入e的副本,并返回新元素的位置
c.erase(val)移除所有值為val的元素,返回移除元素個數

map/multimap應用:優惠購物

問題描述:
某購物網站平臺進行優惠活動,每件商品當天第一個訂單可以打75折。這天網站先后依次接受到了(N<100 000)個訂單,訂單的數據形式是:商品名價格(單價*數量),商品名是長度不超過20請按商品名字典序輸出當天的每種商品名和其售出的總價。

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
#include <iomanip> //要用到格式控制符
using namespace std;
//聲明映射變量m,由m[string]映射double類型的數值
map<string, double>m;
int main()
{string name;double val;int n;cin >> n;for (int i = 1;i <= n;i++){cin >> name >> val;//輸入訂單-商品名和價格if (m.count(name) == 0)	//如果是第一次出現m[name] = val * 0.75;		//打折,m[name]映射了商品價格的數值elsem[name] = val;	//不打折}//構建了map類型迭代器指針map<string, double>::iterator it;cout << "映射結果(統計)" << endl;for (it = m.begin();it != m.end();it++){//輸出商品名和價格							2位浮點數cout << it->first << " " << fixed << setprecision(2) << it->second << endl;}return 0;
}

在這里插入圖片描述

【7】set/multiset(集合/多重集合)操作以及應用

set(集合)是將容器內所有元素都能更具其鍵值自動排序,set元素的鍵值就是實值。set不允許兩個元素有相同的鍵值,multiset可以有相同的鍵值。

set/multiset的幾個特點

set使用平衡二叉樹管理元素(紅黑樹)
set的每個元素值必須唯一,系統會自動將數據排序。他支持插入、刪除、查找等操作,所有的操作都在logN時間之內完成,效率比較高。
set和multiset的區別是:set插入的元素不能相同,而multiset可以相同
操作指令同map

利用set完成隨機數的產生以及排序

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
using namespace std;
//生成n個指定范圍a~b中的不重復隨機數(a<=b<=10000)
int main()
{set<int>s;int n, a, b,x;cin >> n >> a >>b;while (s.size() < n){x = rand() % (b - a + 2) + a;	//產生的隨機數s.insert(x);	//在集合中插入元素(自動去重處理)	}cout << "輸出(默認升序+去重):" << endl;set<int>::iterator it1;	//正向迭代器for (it1 = s.begin();it1 != s.end();it1++)cout << *it1 << " ";cout << endl;return 0;
}

在這里插入圖片描述


總結

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

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

相關文章

Android SAX API: XmlResourceParser及其擴展應用

XmlResourceParser繼承了2個接口&#xff1a;AttributeSet和XmlPullParser。其中XmlPullParser定義了Android SAX框架。跟Java 的SAX API相比&#xff0c;XmlPullParser令人難以置信地簡單。 一、使用XmlResourceParser讀取資源束中的xml 資源束是應用程序編譯后的應用程序包…

linux fdisk 磁盤空間使用率,linux查看磁盤剩余空間以及cpu使用情況

1、查看CPU個數cat /proc/cpuinfo | grep "physical id" | uniqtop可以實時的查看cpu的使用情況2、查看CPU核數cat /proc/cpuinfo | grep "cpu cores" | uniq3、查看CPU型號cat /proc/cpuinfo | grep model name |uniq4、查看內存cat /proc/meminfo | grep…

c語言 函數的參數傳遞示例_restder()函數,帶有C ++中的示例

c語言 函數的參數傳遞示例C restder()函數 (C remainder() function) remainder() function is a library function of cmath header, it is used to calculate the remainder (IEC 60559), it accepts two parameters (numerator and denominator) and returns the remainder…

jquery validation-jquery的驗證框架 詳解(1)

jquery validation驗證框架是一款非常優秀的客戶端數據驗證框架。我們在日常的項目中都會應用得到。今天開始我們會分兩到三個個階段 詳細的了解這款插件 至于這款插件是多么的優秀&#xff0c;怎么個描述法 我這里就不詳細述說。大家可以在接下來的時間里接觸并且感覺它的強大…

已知一個摻雜了多個數字字符的中文名拼音,去掉所有數字字符之后,形式為“名”+空格+“姓”;并且名和姓的首字母大寫,其他小寫,要求輸出姓名全拼,且全為小寫。(后附詳細樣例說明)

已知一個摻雜了多個數字字符的中文名拼音&#xff0c;去掉所有數字字符之后&#xff0c;形式為“名”空格“姓”&#xff1b;并且名和姓的首字母大寫&#xff0c;其他小寫&#xff0c;要求輸出姓名全拼&#xff0c;且全為小寫。&#xff08;后附詳細樣例說明&#xff09; 【輸入…

【視覺項目】【day2】8.21號實驗記錄(手機固定高度15cm拍攝+直方圖均衡化+模板匹配,模板12個,測試28個,效果十分差)

目錄均衡化代碼模板圖片按照大小排序總代碼測試效果新思路由于模板匹配是像素之間的比對&#xff0c;所以不同光照下的像素灰度值也會不同 所以在比對之前&#xff0c;我們需要對測試圖和模板圖進行直方圖均衡化&#xff0c;這一步可以先實現。 今天將采用批量處理的方式&#…

c語言 函數的參數傳遞示例_isgreater()函數以及C ++中的示例

c語言 函數的參數傳遞示例C isgreater()函數 (C isgreater() function) isgreater() function is a library function of cmath header, it is used to check whether the given first value is greater than the second value. It accepts two values (float, double or long…

在一個風景秀麗的小鎮,一天早上,有N名晨跑愛好者(編號1~N)沿著優雅的江邊景觀道朝同一方向進行晨跑

【問題描述】 在一個風景秀麗的小鎮&#xff0c;一天早上&#xff0c;有N名晨跑愛好者(編號1~N)沿著優雅的江邊景觀道朝同一方向進行晨跑&#xff0c;第i名跑者從位置si處起跑&#xff0c;且其速度為Vi。換句話說&#xff0c;對所有的實數t≥0&#xff0c;在時刻t時第i名跑者的…

linux內核測試,Linux內核測試的生命周期

內核持續集成(CKI)項目旨在防止錯誤進入 Linux 內核。在 Linux 內核的持續集成測試 一文中&#xff0c;我介紹了 內核持續集成Continuous Kernel Integration(CKI)項目及其使命&#xff1a;改變內核開發人員和維護人員的工作方式。本文深入探討了該項目的某些技術方面&#xff…

Linux下動態庫使用小結

1. 靜態庫和動態庫的基本概念 靜態庫&#xff0c;是在可執行程序連接時就已經加入到執行碼中&#xff0c;在物理上成為執行程序的一部分&#xff1b;使用靜態庫編譯的程序運行時無需該庫文件支持&#xff0c;哪里都可以用&#xff0c;但是生成的可執行文件較大。動態庫&#xf…

【視覺項目】【day3】8.22號實驗記錄(利用canny檢測之后的來進行模板匹配)

【day3】8.22號實驗記錄&#xff08;幾乎沒干正事的一天&#xff0c;利用canny檢測之后的來進行模板匹配&#xff09; 今天沒搞代碼&#xff0c;主要是問研究生學長工業攝像頭的接法的&#xff0c;學長也不知道&#xff0c;明天問問老師。。。 晚上搞了一下canny之后的模板匹配…

scala字符替換_如何替換Scala中的“壞”字符?

scala字符替換In Scala, programming language, all sorts of special characters are valid. The character set library is quite good and supports almost all characters in Scala programming. 在編程語言Scala中&#xff0c;各種特殊字符均有效。 字符集庫非常好&#x…

linux dd 大文件下載,Linux dd+grep 大文件二分查找

Linux dd 命令用于讀取、轉換并輸出數據。dd 可從標準輸入或文件中讀取數據&#xff0c;根據指定的格式來轉換數據&#xff0c;再輸出到文件、設備或標準輸出。參數說明(dd --help)Usage: dd [OPERAND]...or: dd OPTIONCopy a file, converting and formatting according to th…

【視覺項目】【day1】8.20號實驗記錄(初步使用模板匹配)

目錄【day1】8.20號實驗記錄&#xff08;初步使用模板匹配&#xff09;模板匹配單張圖的代碼利用多個模板去匹配多張圖的代碼寫代碼過程中遇到的問題【day1】8.20號實驗記錄&#xff08;初步使用模板匹配&#xff09; 模板匹配 利用模板匹配可以框定出瓶子&#xff0c;但是卻…

第四章 纖維結構對染色性能的影響單元測驗

1,利用紅外光譜技術可以測定纖維的() 化學結構。 2,纖維完整的結構包括() 化學結構。 表面形態結構。 內部超分子結構。 3,纖維化學結構由于影響了纖維(),進而影響其染色性能 吸濕溶脹性能。 在染液中電離性能。 在染浴中的帶電性。 與染液中各組分之間的作用力。 …

創建存儲過程時出現的This function has none of DETERMINISTIC, NO SQL解決辦法

This function has none of DETERMINISTIC, NO SQL解決辦法創建存儲過程時 出錯信息&#xff1a; ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the …

如何讓沒有安裝網頁中所需字體的用戶也能得到一致的瀏覽效果【轉】

今天給大家談一個關于字體的話題,我們在做項目的過程中會遇到一些在psd中的字體在自己的電腦中沒有安裝&#xff0c;或者是一些特殊的文字&#xff0c;通常的做法是把它切成圖片&#xff0c;但是如果這個站是多個語言的&#xff0c;那我們是不是把每個語言的都切一張圖片呢&…

【視覺項目】【day4】8.24號實驗記錄(消除瓶子內部“邊緣”)

思路分析以及代碼 思路1&#xff1a;使用findContours函數&#xff0c;設置輪廓為最外部RETR_EXTERNAL&#xff0c;結果發現結果仍然是所有輪廓。 思路2&#xff1a;先二值化&#xff0c;然后進行閉操作&#xff0c;然后canny&#xff0c;得到的輪廓確實比之前少很多&#xff…

operator.ne_Python operator.ne()函數與示例

operator.neoperator.ne()函數 (operator.ne() Function) operator.ne() function is a library function of operator module, it is used to perform "not equal to operation" on two values and returns True if the first value is not equal to the second val…

國產操作系統和linux 之間的關系,為何國產系統大多基于開源Linux?操作系統從0做起到底有多難?...

今年貌似是國產操作系統的“爆發”之年&#xff0c;除了老牌的銀河麒麟、中標麒麟、深度之外&#xff0c;中興近日發布了自己的“新支點”&#xff0c;華為也公開了自研的操作系統“鴻蒙”。縱觀這些國產操作系統&#xff0c;大多基于開源的Linux。那么為什么我們不可以從0開始…