STL容器及適配器

STL容器

?

1.序列式容器

:?vector,deque,list

每個元素都有固定的位置(取決于插入的時機和位置,與元素值無關)。

?

vector

特點:
將一個元素置于一個動態數組中加以管理,可以隨機存取元素。在數組尾部添加或刪除元素非常快速,但是在中部或頭部插入或刪除元素比較耗時。

deque

“double-ended queue” 雙端隊列,可以隨機存取。數組尾部或頭部添加或刪除元素非常快速,但在中部插入或刪除元素比較費時。實際上,deque 是對vector 和list 優缺點的結合,它是處于兩者之間的一種容器。

list

雙向鏈表,不提供隨機存取(按順序存儲),在任何位置插入或刪除動作都非常迅速。只能順序訪問(從前向后或者從后向前)。與前面兩種容器類有一個明顯的區別就是:它不支持隨機訪問。要訪問表中某個下標處的項需要從表頭或表尾處(接近該下標的一端)開始循環。而且缺少下標預算符:operator[]。

1?vector

向量 相當于一個數組
??? 在內存中分配一塊連續的內存空間進行存儲。支持不指定vector大小的存儲。STL內部實現時,首先分配一個非常大的內存空間預備進行存儲,即capacituy()函數返回的大小,當超過此分配的空間時再整體重新放分配一塊內存存儲,這給人以vector可以不指定vector即一個連續內存的大小的感覺。通常此默認的內存分配能完成大部分情況下的存儲。
?? 優點:(1) 不指定一塊內存大小的數組的連續存儲,即可以像數組一樣操作,但可以對此數組
?????????????? 進行動態操作。通常體現在push_back() pop_back()
?????????????? (2) 隨機訪問方便,即支持[ ]操作符和vector.at()
?????????????? (3) 節省空間。
?? 缺點:(1) 在內部進行插入刪除操作效率低。
?????????????? (2) 只能在vector的最后進行push和pop,不能在vector的頭進行push和pop。
??????????????? (3)?當動態添加的數據超過vector默認分配的大小時要進行整體的重新分配、拷貝與釋放?。

操作:

1插入和刪除操作push_back,pop_back(只能在數組尾部進行),刪除特定位置元素erase;

2返回固定位置的元素at(int n),支持【】操作,頭和尾元素front,back;

3返回頭或尾的指針用begin,end;

4其他:size,swap,empty;


2?list
??? 雙向鏈表
??? 每一個結點都包括一個信息快Info、一個前驅指針Pre、一個后驅指針Post。可以不分配必須的內存大小方便的進行添加和刪除操作。使用的是非連續的內存空間進行存儲。
?? 優點:(1) 不使用連續內存完成動態操作。
???????????????(2) 在內部方便的進行插入和刪除操作
?????????????? (3) 可在兩端進行push、pop
?? 缺點:(1)?不能進行內部的隨機訪問,即不支持[ ]操作符和vector.at()
?????????????? (2) 相對于verctor占用內存多

? 操作:

???????

函數名??? 說明

assign()??? 給list賦值back()?? 返回最后一個元素begin()??? 返回指向第一個元素的迭代器

clear()? empty()? erase() 刪除一個元素 remove()從list刪除元素

remove_if()???? 按指定條件刪除元素

front()???? 返回第一個元素? end()?????? 返回末尾的迭代器

insert()???? 插入一個元素到list中pop_back()?????? 刪除最后一個元素

pop_front()???? 刪除第一個元素push_back()?????? 在list的末尾添加一個元素

push_front()??? 在list的頭部添加一個元素

reverse()? 把list的元素倒轉

size()?????? 返回list中的元素個數

sort()?????? 給list排序

splice()???? 合并兩個list,源list的內容部分或全部元素刪除,拼插入到目的list

swap()???? 交換兩個list

unique()?? 刪除list中重復的元素



3?deque
???雙端隊列 double-end queue
???deque是在功能上合并了vector和list。
?? 優點:(1) 隨機訪問方便,即支持[ ]操作符和vector.at()
???????????????(2) 在內部方便的進行插入和刪除操作
?????????????? (3) 可在兩端進行push、pop
?? 缺點:(1) 占用內存多
? 操作:

pop_back() 刪除尾部的元素pop_front() 刪除頭部的元素

push_back() 在尾部加入一個元素push_front() 在頭部加入一個元素

其他vector有的他也有。(與vector區別就是他多一個頭部插入和刪除的功能)

?

?


使用區別:
???? 1 如果你需要高效的隨即存取,而不在乎插入和刪除的效率,使用vector?
???? 2 如果你需要大量的插入和刪除,而不關心隨即存取,則應使用list?
???? 3 如果你需要隨即存取,而且關心兩端數據的插入和刪除,則應使用deque

?

?

2.關聯式容器

:set,multiset, map, multimap

元素位置取決于特定的排序準則,與插入順序無關。

???

????

?

?

關聯容器和順序容器的本質區別:?

關聯容器是通過鍵存取和讀取元素、順序容器通過元素在容器中的位置順序存儲和訪問元素。因此,關聯容器不提供front、push_front、pop_front、back、push_back以及pop_back,此外對于關聯容器不能通過容器大小來定義,因為這樣的話將無法知道鍵所對應的值什么。

?

都支持find、count、insert、erase操作。

?

Sets/Multisets:
內部的元素依據其值自動排序,Set內的相同數值的元素只能出現一次,Multisets內可包含多個數值相同的元素,內部由二叉樹實現(實際上基于紅黑樹(RB-tree)實現),便于查找;

? 操作:

???????

?

Maps/Multimaps:

Map的元素是成對的鍵值/實值,內部的元素依據其值自動排序,Map內的相同數值的元素只能出現一次,Multimaps內可包含多個數值相同的元素,內部由二叉樹實現(實際上基于紅黑樹(RB-tree)實現),便于查找;

map就是一個容器,里面裝的就是若干個pair。每個pair的第一個元素,稱為鍵(注意鍵的類型必須支持小于(<)操作),第二個元素,稱為值。對于普通的map,每個鍵都對應一個值。這樣的看起來,鍵類似于數組的下標,而值類似于數組的值。

?

?

?

STL容器適配器

:棧stack 、隊列queue 和優先級priority_queue

?

適配器是容器的接口,它本身不能直接保存元素,它保存元素的機制是調用

另一種順序容器去實現,即可以把適配器看作“它保存一個容器,這個容器再保
存所有元素”。(不能由迭代器訪問元素或者數組下表訪問元素)
*STL 中提供的三種適配器可以由某一種順序容器去實現。默認下stack 和queue 基于deque 容器實現,priority_queue 則基于vector 容器實現。由于適配器的特點,一個適配器不是可以由任一個順序容器都可以實現的。棧stack 的特點是后進先出,所以它關聯的基本容器可以是任意一種順序容器,因為這些容器類型結構都可以提供棧的操作有求,它們都提供了push_back 、pop_back 和back 操作。隊列queue 的特點是先進先出,適配器要求其關聯的基礎容器必須提供pop_front 操作,因此其不能建立在vector 容器上。

?

//插入和刪除push,pop(注意區分不同數據結構此操作區別)無insert操作。

//均有清空及返回數據個數的操作,無erase操作;

//返回頂或頭、尾,用top,(front,back)》》不能由迭代器訪問元素或者數組下標訪問元素

?

1 Stacks(堆棧)
C++ Stack(堆棧)是一個容器類的改編,為程序員提供了堆棧的全部功能,—
—也就是說實現了一個先進后出(FILO)的數據結構。
1.empty() 堆棧為空則返回真
2.pop() 移除棧頂元素
3.push() 在棧頂增加元素
4.size() 返回棧中元素數目
5.top() 返回棧頂元素
2?C++ Queues(隊列)
C++隊列是一種容器適配器,它給予程序員一種先進先出(FIFO)的數據結構。
1.back() 返回一個引用,指向最后一個元素
2.empty() 如果隊列空則返回真
3.front() 返回第一個元素
4.pop() 刪除第一個元素
5.push() 在末尾加入一個元素
6.size() 返回隊列中元素的個數
3?Priority Queues(優先隊列)
C++優先隊列類似隊列,但是在這個數據結構中的元素按照一定的斷言排列有
序。(http://www.cnblogs.com/heqinghui/archive/2013/07/30/3225407.html)
1.empty() 如果優先隊列為空,則返回真
2.pop() 刪除第一個元素

3.push() 加入一個元素
4.size() 返回優先隊列中擁有的元素的個數
5.top() 返回優先隊列中有最高優先級的元素

?

#include<queue>?

#include<vector>?

//定義結構,使用運算符重載,自定義優先級1? 
struct cmp1{? 
????bool operator ()(int &a,int &b){? 
????????return a>b;//最小值優先? 
????}? 
};? 
struct cmp2{? 
????bool operator ()(int &a,int &b){? 
????????return a<b;//最大值優先? 
????}? 
};? 
//定義結構,使用運算符重載,自定義優先級2? 
struct number1{? 
????int x;? 
????bool operator < (const number1 &a) const {? 
????????return x>a.x;//最小值優先? 
????} ?
};? 
struct number2{? 
????int x;? 
????bool operator < (const number2 &a) const {? 
????????return x<a.x;//最大值優先? 
????}? 
};? 
    priority_queue<int>que;//采用默認優先級構造隊列? 
??
????priority_queue<int,vector<int>,cmp1>que1;//最小值優先? 
????priority_queue<int,vector<int>,cmp2>que2;//最大值優先? 
????priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”會被認為錯誤,? 
??????????????????????????????????????????????????????//這是右移運算符,所以這里用空格號隔開? 
????priority_queue<int,vector<int>,less<int> >que4;最大值優先? 

?

轉載于:https://www.cnblogs.com/biggan/p/STL.html

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

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

相關文章

Html5 Canvas斗地主游戲

過完年來公司&#xff0c;沒什么事&#xff0c;主管說研究下html5 游戲&#xff0c;然后主管就給了一個斗地主的demo&#xff0c;隨后我就開始看代碼&#xff0c; 現在我看了html5以及canvas相關知識和斗地主的demo后&#xff0c;自己用demo上的素材試著寫了個斗地主&#xff0…

java流的傳遞方式是_如何在方法中流式傳輸Java List(Varargs)的值?

我有以下方法&#xff1a;public static List getValuesExclusion(A exclusion) {return Arrays.stream(values()).filter(item -> item ! exclusion).collect(Collectors.toList());}//this function returns enum list of A types that has no A typeexclusion現在我想將它…

JAVA作業——JAVA課程的總結及學習計劃

JAVA作業——JAVA課程的總結及學習計劃 NO.1 總結 在上一年的學習中&#xff0c;對JAVA語言比較陌生&#xff0c;英語基礎不好&#xff0c;so學習起來有點困難&#xff0c;對JAVA的一些語法和編程記得比較少。 NO.2 計劃 對過去一年的認真反思之后&#xff0c;我的計劃如下&…

由LintCode問題子集出發,淺析ArrayList的拷貝問題

在做LintCode上的遞歸類題目子集時&#xff0c;我一開始的想法是遞歸到最后一層即單元素時然后開始逐層返回&#xff0c;產生相應的每層的子集并添加到最終的結果中去。于是乎有了以下代碼&#xff1a; public List<List<Integer>> findSolution(int[] nums, int b…

大小端模式詳解

http://www.cnblogs.com/xinsheng/archive/2012/04/18/2455039.html 端模式&#xff08;Endian&#xff09;的這個詞出自Jonathan Swift書寫的《格列佛游記》。這本書根據將雞蛋敲開的方法不同將所有的人分為兩類&#xff0c;從圓頭開始將雞蛋敲開的人被歸為Big Endian&#xf…

.NET 跨平臺服務端資料

OWIN Web API: http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api 用于寫API的 OWIN SignalR: http://www.dotnetcurry.com/signalr/915/owin-katana-signalr-web-server 用于寫即時通訊的轉載于:https://www.cnblogs.com/Jarvin…

mysql的查詢、子查詢及連接查詢

一、mysql查詢的五種子句 where子句&#xff08;條件查詢&#xff09;&#xff1a;按照“條件表達式”指定的條件進行查詢。 group by子句&#xff08;分組&#xff09;&#xff1a;按照“屬性名”指定的字段進行分組。group by子句通常和count()、sum()等聚合函數一起使用。 h…

BZOJ-1192-鬼谷子的錢袋

描述 鬼谷子非常聰明&#xff0c;正因為這樣&#xff0c;他非常繁忙&#xff0c;經常有各諸侯車的特派員前來向他咨詢時政。有一天&#xff0c;他在咸陽游歷的時候&#xff0c;朋友告訴他在咸陽最大的拍賣行&#xff08;聚寶商行&#xff09;將要舉行一場拍賣會&#xff0c;其中…

lamp 獨立mysql_lamp or lnmp 環境搭建之獨立安裝mysql數據庫

lamp or lnmp 環境搭建,如果mysql 是獨立安裝的則需要授權&#xff1a;單獨一臺服務器獨立安裝mysql安裝后&#xff0c;優化服務器。授權實例如下&#xff1a;創建用戶CREATE USER demo IDENTIFIED BY “passwd123”;授權使用mysql數據庫下面的所有表GRANT ALL PRIVILEGES ON m…

item 24: 區分右值引用和universal引用

本文翻譯自《effective modern C》&#xff0c;由于水平有限&#xff0c;故無法保證翻譯完全正確&#xff0c;歡迎指出錯誤。謝謝&#xff01; 博客已經遷移到這里啦 古人曾說事情的真相會讓你覺得很自在&#xff0c;但是在適當的情況下&#xff0c;一個良好的謊言同樣能解放你…

WebLogic11g-常用運維操作

轉自&#xff1a;https://dead-knight.iteye.com/blog/1940399 希望這篇能把weblogic運維時經常遇到的問題、常用的配置匯總到一起。 1、配置jvm參數&#xff1a; 一般在domain啟動過程中會看到以下啟動的日志信息&#xff0c;如下圖所示&#xff1a; 圖中紅色方框部分為啟動we…

牛腩新聞發布系統(一):SQLHelper重構(一)

導讀&#xff1a;在機房重構的時候&#xff0c;就用到了SQLHelper&#xff0c;但那時候即使把代碼反復看了很多遍&#xff0c;也看了注釋&#xff0c;還和同學交流&#xff0c;也依然是半懂不懂。現在&#xff0c;我再次用到了SQLhelper這個東西&#xff0c;就來說說SQLHelper是…

OPENCV圖像輪廓檢測

前面在圖像轉換的時候學到canny算子,可以檢測出圖像的輪廓信息,但是,該算子檢測到的輪廓信息還需要我們手動的用眼睛去識別,而實際工程應用中,我們需要得到輪廓的具體數學信息,這就涉及到今天的主題,圖像輪廓檢測. 一.圖像輪廓檢測 在opencv中,輪廓對應著一系列的點的集合,open…

mysql 5.7.11 授權_mysql 5.7.11 安裝配置教程

六步輕松搞定mysql5.7.11的安裝1、下載安裝包。mysql-5.7.11版本&#xff1a;2、拷貝到任意盤&#xff1a;例如&#xff0c;解壓后拷貝文件夾至C盤&#xff1a;C:\Program Files\mysql。建議文件夾名字使用英文。3、配置環境變量&#xff1a;計算機—>右鍵—>高級系統設置…

iOS 面試之Block

轉自&#xff1a;http://blog.csdn.net/xunyn/article/details/11658261 1 什么是block 對于閉包&#xff08;block),有很多定義&#xff0c;其中閉包就是能夠讀取其它函數內部變量的函數&#xff0c;這個定義即接近本質又較好理解。對于剛接觸Block的同學&#xff0c;會覺得有…

當安全遇到大數據 “永恒之藍”也將無所遁形!

文章講的是當安全遇到大數據 “永恒之藍”也將無所遁形&#xff01;5月12日&#xff0c;席卷全球的勒索病毒“永恒之藍”讓全世界都為之震動&#xff0c;這是迄今為止全球最大規模的勒索病毒網絡攻擊&#xff0c;100多個國家受到病毒感染&#xff0c;國內中石油、公安內網、高校…

[ES] 安裝

1.ElasticSearch安裝的準備工作 Linux&#xff1a;CentOS6.4 Elasticsearc:elasticsearch-2.2.0 JDK:jdk-7u79-linux-x64 IK:1.8.0 MAVEN:apache-maven-3.3.3-bin 2.配置網絡靜態文件 虛擬機設置橋接模式 配置&#xff1a;vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVIC…

語言基礎之description方法

1.description方法的一般用處 1: // 指針變量的地址 2: NSLog("%p", &p); 3: // 對象的地址 4: NSLog("%p", p); 5: // <類名&#xff1a;對象地址> 6: NSLog("%", p); 1: Class c [Person class]; 2: …

亞信安全協助綠谷制藥確保“秘方”安全

近幾年&#xff0c;我國醫藥生物技術發展態勢迅猛&#xff0c;加強知識產權保護己成為當務之急。為確保制藥配方數據和生產管理信息系統安全&#xff0c;上海綠谷制藥有限公司采用亞信安全服務器深度安全防護系統&#xff08;Deep Security&#xff09;和亞信安全防毒墻網絡版&…

mysql判斷疊字_格律詩的八大語法特點

古風的語法&#xff0c;本來就和散文的語法大致相同&#xff0c;直到近體詩&#xff0c;才漸和散文不同&#xff0c;原因是&#xff0c;首先在區區五字或七字之中&#xff0c;要施展豐富的想象&#xff0c;不能不力求簡潔&#xff0c;凡可省去而不至于影響語意的字&#xff0c;…