c++容器及STL

一突委、容器——C++ primer 6th P713

儲存其他對象的對象逆巍,且該對象有處理“其他對象”的方法惧辈。
1)容器優(yōu)點

  • 容器類為解決對特定代碼重用。
  • 可自行擴展铆遭。
  • 容器類自動申請和釋放內存.
基本容器特征 C++ primer P695
c++11 新增容器要求 P696
1.1 序列容器(sequence)

序列中的元素有確定的順序

  • 迭代器至少是正向迭代器:保證元素按特定順序排序硝桩。
  • 要求其元素線性順序排列:存在首、尾元素枚荣,其余元素前后分別只有一個元素亿柑。
序列的要求

表中 t 表示類型為T(儲存在容器中的值類型)的值, n 表示整數(shù)棍弄, p、q疟游、i 和 j 表示迭代器呼畸。

序列可選要求
  • 表中操作復雜度為固定
  • vector 未定義在頭部操作(插入颁虐、刪除)——操作復雜度為線性蛮原。
  • list不支持數(shù)組表示法[ ]和隨機訪問.at( )
  • vector另绩、list是可反轉容器儒陨。
1)向量vector(線性表順序儲存)
  • 可直接訪問元素花嘶。
  • 線性順序結構,支持[ ]vector.at()蹦漠。
  • 動態(tài)內存分配椭员。
  • 內部插入、刪除效率低笛园。通常在后端進行追加和刪除隘击。
2) 雙向鏈表 list

中間每個元素都與前后元素鏈接⊙忻可以雙向遍歷鏈表埋同。

  • 鏈表不支持隨機訪問,不能用非成員函數(shù)的sort(),因此該類中定義了成員函數(shù)sort()棵红。
  • 單鏈表forward_list(C++11)凶赁。
list成員函數(shù)
3)雙端隊列 deque(double-ended queue)
  • deque雙端隊列:允許在兩端插入和刪除元素。
雙端隊列的一些操作
4)適配器類(挖坑逆甜,目前僅了解)
  • queue隊列:是一種操作受限制的線性表——只允許在隊首(front)刪除元素虱肄、隊尾(rear)添加元素。
    給底層類(默認queue)提供隊列接口忆绰。
queue的操作
  • priorty_queue:支持操作與queue相同浩峡。該模板類中最大的元素移到隊首。错敢?翰灾??如何移
  • stack 棧:給底層類(默認vector)提供棧接口稚茅。
stack的操作
1.2 關聯(lián)式容器

關聯(lián)容器將關聯(lián)在一起纸淮,并使用鍵來查找值。

  • 優(yōu)點:對元素快速訪問亚享。
  • 關聯(lián)容器允許插入新元素咽块,但不能指定插入位置:通常有用于確定數(shù)據(jù)放置位置的算法。
  • 通常使用樹結構實現(xiàn)欺税。
1)集合set侈沪、multiset

#include<set>
其值類型與鍵相同,鍵是唯一的晚凿。

  • set :鍵就是值亭罪。
  • multiset :多個值的鍵相同。
2)map歼秽、multimap

#include<map>
其值類型與鍵不相同应役,鍵是唯一的。

  • map :每個鍵只對應一個值。
  • multimap :每個鍵與多個值相關聯(lián)箩祥。
3)無序關聯(lián)容器unordered_(C++11)
  • 關聯(lián)容器:基于樹結構的院崇。
  • 無序關聯(lián)容器:基于數(shù)據(jù)結構哈希表的,旨在提高添加袍祖、刪除元素的速度及提高查找算法效率底瓣。
    unordered_set 和 unordered_multiset
    unordered_map 和 unordered_multimap

二、STL函數(shù)——適用于容器的非成員函數(shù)

#include<algorithm>

books對象容器的源結構類型

  • for_each():將被指向函數(shù)應用于容器區(qū)間中的各個元素盲泛。要求元素隨機訪問濒持。
for(vector<Review>::iterator pr=books.begin();pr<books.end();pr++)
   ShowReview(*pr);
  • 避免顯示調用迭代器,可寫為for_each(books.begin(),books.end(),ShowReview);
  • 可替換為基于范圍的for循環(huán)
    for(auto x : books) ShowReview(x);
    x類型為Review,循環(huán)一次將books中每個Review對象傳遞給ShowReview()寺滚。
  • 不同于for_each(),基于范圍for循環(huán)可使用引用&修改容器內容:
    for(auto & x : books) InflateReview(x);
  • random_shuffle():接受兩個指定區(qū)間的迭代器參數(shù)柑营,并隨機排列該區(qū)間中的元素。

  • sort():排序時使用內置操作符<進行比較;若對用戶自定義對象使用sort()村视,則必須定義能夠處理該類型對象的operator<()函數(shù)(操作符重載);要求元素隨機訪問

c++ primer P681 全排序

c++ primer P681 完整弱排序
(1)sort(a.begin(),a.end()); //對a中的從a.begin()(包括它)到a.end()(不包括它官套,超尾元素)的元素進行從小到大排列
(2)reverse(a.begin(),a.end()); //元素倒置,但不排列.
(3)find(a.begin(),a.end(),10); //a中查找10蚁孔,若存在返回其在向量中的位置

三奶赔、迭代器

模板使算法獨立于存儲的數(shù)據(jù)類型;迭代器使獨立于使用的容器類型杠氢。

注意:迭代器不是常量站刑,是廣義指針:能夠遍歷容器的對象。

實現(xiàn)find函數(shù)鼻百,迭代器需具備的特征:

  • 能對迭代器*解引用操作绞旅,訪問其引用的值。
  • 能將一個迭代器賦給另一個温艇;迭代器之間能夠比較因悲。
  • 能夠使用迭代器遍歷容器的所有元素——++運算符。C++將operator++前綴版本勺爱,operator++(int)后綴版本晃琳。
  • s.end():返回一個指向超尾位置(末尾后一位)的迭代器。
  • auto :自動類型推斷琐鲁,簡化
vector<double> s;
auto pd = s.begin(); //替代 vector<double>::iterater pd=s.begin(); 
1)迭代器功能分類

排序算法需要通過隨機訪問迭代器來訪問容器中的元素卫旱,因此有的容器就不支持排序算法。

常用的迭代器按功能強弱分為輸入围段、輸出顾翼、正向、雙向蒜撮、隨機訪問五種,這里只介紹常用的三種。

  • 正向迭代器段磨。假設 p 是一個正向迭代器取逾,則 p 支持以下操作:++p,p++苹支,*p砾隅。此外,兩個正向迭代器可以互相賦值债蜜,還可以用==!=運算符進行比較晴埂。

  • 雙向迭代器。雙向迭代器具有正向迭代器的全部功能寻定。除此之外儒洛,若 p 是一個雙向迭代器,則--p和p--都是有定義的狼速。--p使得 p 朝和++p相反的方向移動琅锻。

  • 隨機訪問迭代器。隨機訪問迭代器具有雙向迭代器的全部功能向胡。若 p 是一個隨機訪問迭代器恼蓬,i 是一個整型變量或常量,則 p 還支持以下操作:

p+=i:使得 p 往后移動 i 個元素僵芹。
p-=i:使得 p 往前移動 i 個元素处硬。
p+i:返回 p 后面第 i 個元素的迭代器。
p-i:返回 p 前面第 i 個元素的迭代器拇派。
p[i]:返回 p 后面第 i 個元素的引用荷辕。

隨機訪問迭代器: p1、p2

  • p1<p2 :p1 經過若干次(至少一次)++操作后攀痊,就會等于 p2桐腌。 可用 <、>苟径、<=案站、>= 運算符進行比較。
  • p2-p1 :返回值是 p2 所指向元素和 p1 所指向元素的序號之差(p2 和 p1 之間的元素個數(shù)減一)棘街。
    ++ii++執(zhí)行速度更快庶香。

表1:不同容器的迭代器的功能

容器 迭代器功能
vector 隨機訪問
deque 隨機訪問
list 雙向
set / multiset 雙向
map / multimap 雙向
stack 不支持迭代器
queue 不支持迭代器
priority_queue 不支持迭代器
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市忧设,隨后出現(xiàn)的幾起案子崔泵,更是在濱河造成了極大的恐慌,老刑警劉巖险污,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痹愚,死亡現(xiàn)場離奇詭異富岳,居然都是意外死亡,警方通過查閱死者的電腦和手機拯腮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門窖式,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人动壤,你說我怎么就攤上這事萝喘。” “怎么了琼懊?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵阁簸,是天一觀的道長。 經常有香客問我哼丈,道長启妹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任削祈,我火速辦了婚禮翅溺,結果婚禮上,老公的妹妹穿的比我還像新娘髓抑。我一直安慰自己咙崎,他們只是感情好,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布吨拍。 她就那樣靜靜地躺著褪猛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羹饰。 梳的紋絲不亂的頭發(fā)上伊滋,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音队秩,去河邊找鬼笑旺。 笑死,一個胖子當著我的面吹牛馍资,可吹牛的內容都是我干的筒主。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼鸟蟹,長吁一口氣:“原來是場噩夢啊……” “哼乌妙!你這毒婦竟也來了?” 一聲冷哼從身側響起建钥,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤藤韵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熊经,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體泽艘,經...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡欲险,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了匹涮。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盯荤。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖焕盟,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情宏粤,我是刑警寧澤脚翘,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布绍哎,位于F島的核電站来农,受9級特大地震影響,放射性物質發(fā)生泄漏崇堰。R本人自食惡果不足惜沃于,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望海诲。 院中可真熱鬧繁莹,春花似錦、人聲如沸特幔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚯斯。三九已至薄风,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拍嵌,已是汗流浹背遭赂。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留横辆,地道東北人撇他。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像龄糊,于是被迫代替她去往敵國和親逆粹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內容

  • C++ STL之vector用法總結 介紹 vector是表示可變大小數(shù)組的序列容器炫惩。 就像數(shù)組一樣僻弹,vector...
    誰拿了我的帽子閱讀 326評論 0 0
  • STL部分 1.STL為什么廣泛被使用 C++ STL 之所以得到廣泛的贊譽,也被很多人使用他嚷,不只是提供了像vec...
    杰倫哎呦哎呦閱讀 4,315評論 0 9
  • 1.順序容器 順序容器是將單一類型元素聚集起來成為容器蹋绽,然后根據(jù)位置來存儲和訪問這些元素芭毙。標準庫常用順序容器如下:...
    Mr希靈閱讀 744評論 0 4
  • STL實用技術專題 STL詳細的說六大組件 1. string 相關函數(shù) 相關算法: 2. Vector 向量是表...
    小張同學_loveZY閱讀 495評論 0 0
  • STL(Standard Template Library)里有很多組成部分,但是主要有三個卸耘,容器退敦、迭代器和算法 ...
    再想想1991閱讀 795評論 0 1