【GeekBand】stl第二周

1.容器

1.1 stack

stack是一種先進后出的數據結構酿雪,stack 模板類的定義在<stack>頭文件中。
stack 模板類需要兩個模板參數瘪撇,一個是元素類型,一個容器類型堡赔,但只有元素類型是必要
的,在不指定容器類型時设联,默認的容器類型為deque善已。
定義stack 對象的示例代碼如下:
stack<int> s1;
stack<string> s2;
stack 的基本操作有:
入棧灼捂,如例:s.push(x);
出棧,如例:s.pop();注意换团,出棧操作只是刪除棧頂元素悉稠,并不返回該元素。
訪問棧頂艘包,如例:s.top()
判斷椀拿停空,如例:s.empty()想虎,當椮宰穑空時,返回true舌厨。
訪問棧中的元素個數岂却,如例:s.size()。
補充:stack的三種含義
含義一:數據結構
stack的第一種含義是一組數據的存放方式裙椭,特點為LIFO躏哩,即后進先出(Last in, first out)。
既上述stl中所描述的stack

含義二:代碼運行方式
stack的第二種含義是"調用棧"(call stack)揉燃,表示函數或子例程像堆積木一樣存放扫尺,以實現層層調用。

含義三:內存區(qū)域
stack的第三種含義是存放數據的一種內存區(qū)域炊汤。程序運行的時候器联,需要內存空間存放數據。一般來說婿崭,系統(tǒng)會劃分出兩種不同的內存空間:一種叫做stack(棧)拨拓,另一種叫做heap(堆)。
它們的主要區(qū)別是:stack是有結構的氓栈,每個區(qū)塊按照一定次序存放渣磷,可以明確知道每個區(qū)塊的大小授瘦;heap是沒有結構的醋界,數據可以任意存放。因此提完,stack的尋址速度要快于heap形纺。

2.2 queue

queue 隊列也是一個線性存儲表,與后進先出的堆棧不同徒欣,元素數據的插入在表的一端進行逐样,在另一端刪除,從而構成了一個先進先出(First In First Out) 表。插入一端稱為隊尾脂新,刪除一端稱為隊首挪捕。
由于C++ STL 的隊列泛化,默認使用雙端隊列 deque 來實現争便,因此级零,queue 也可看成一個容器的適配器,將 deque 容器轉換為 queue 容器滞乙。當然奏纪,也可以利用其它合適的序列容器作為底層實現 queue 容器。
queue隊列容器的C++標準頭文件為 queue 斩启,需要用宏語句 "#include <queue>" 包含進來才可應用 queue 容器進行開發(fā)序调。

1.3 map

map是一種關聯容器,存儲的對象是一組key/value
不允許有重復的key
map存儲的對象必須是可排序性的

template<class _kty, class _ty, class _pr = less<_kty>,
               class _Alloc = allocator<pari<const _kty,_ty>>>
               class map{...}

默認采用less定義排序行為浇垦,如果map中存儲的是自己定義的類炕置,則需要重載operator <
或者可以通過仿函數自定義排序行為

1.3 set

set是一種關聯容器,存儲的對象既是key又是value
這是 set與map的最大區(qū)別
MAP的節(jié)點是一對數據.
SET的節(jié)點是一個數據.
Map使用關鍵值Key來唯一標識每一個成員 男韧,map可以重復朴摊。
set是集合 ,不能重復
在作業(yè)中遇到的問題:set的iterator類型自動就是const的引用類型此虑,因此當set保存的是類類型時甚纲,對iterator解引用無法調用類的非const成員。
解決辦法:1.set中不存儲對象本身朦前,改為存儲對象指針
2.利用const_cast<Programmer&> 進行轉型

2.仿函數

仿函數又稱函數對象介杆,從名字上可以得出,它本質上是 **一種具有函數特質的對象**韭寸, 也即可以像使用函

數一樣使用該對象春哨。怎么樣做?重載operator()運算符即可恩伺,有了這個運算符赴背,我們就可以在仿函數對象后
面加上一對小括號,以此調用仿函數所定義的operator()晶渠。STL仿函數可以分為一元和二元凰荚,或者算術運
算、關系運算和邏輯運算褒脯。
為什么要有仿函數便瑟?在算法的設計過程中,我們會發(fā)現其本質往往是不變的(例如排序算法的思想)番川,變
化的除了數據之外還有操作(例如排序中不一定是比較大小到涂,也可以是兩兩之間滿足某種關系)脊框,仿函數就
是為了這種情況產生的,它替代原來需要函數指針的地方养盗,把這種操作或者策略傳給算法缚陷,使得算法抽象性
更高适篙,也就更通用往核。
為什么不用函數指針?很簡單的解釋是抽象性不夠嚷节,更進一步說是它無法配接聂儒,也就是可以將操作配接在
一起變換為更復雜的操作(例如compose和bind1st等等方法),仿函數則可以輕松實現這些配接硫痰,使得其功
能異常強大衩婚。
仿函數在實現上是一個結構體,并且如上所述重載了operator()運算符效斑,所有的仿函數如果是一元的都繼
承自unary_function非春,二元則繼承自binary_function,因為繼承自這兩個函數的仿函數均定義了相應型別供
配接時使用,也就具有了配接能力缓屠。

template <class Arg, class Result>
struct unary_function {
typedef Arg argument_type;
typedef Result result_type;
};

template <class Arg1, class Arg2, class Result>
struct binary_function {
typedef Arg1 first_argument_type;
typedef Arg2 second_argument_type;
typedef Result result_type;
};

2.仿函數適配器

由于在for_each的定義中只接受f(obj)這種類型的調用奇昙,mem_fun和mem_fun_ref的存在可以讓obj的成員函數f可以以f(obj)這種形式被調用

for_each(set1.begin() , set1.end() , mem_fun(&Programmer::print));

需要注意的是如果set中存儲的是對象本身,則需要使用mem_fun_ref,如果存儲的是對象指針則使用mem_fun

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末敌完,一起剝皮案震驚了整個濱河市储耐,隨后出現的幾起案子,更是在濱河造成了極大的恐慌滨溉,老刑警劉巖什湘,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異晦攒,居然都是意外死亡闽撤,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門脯颜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哟旗,“玉大人,你說我怎么就攤上這事伐脖∪柔#” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵讼庇,是天一觀的道長绎巨。 經常有香客問我,道長蠕啄,這世上最難降的妖魔是什么场勤? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任戈锻,我火速辦了婚禮,結果婚禮上和媳,老公的妹妹穿的比我還像新娘格遭。我一直安慰自己,他們只是感情好留瞳,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布拒迅。 她就那樣靜靜地躺著,像睡著了一般她倘。 火紅的嫁衣襯著肌膚如雪璧微。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天硬梁,我揣著相機與錄音前硫,去河邊找鬼。 笑死荧止,一個胖子當著我的面吹牛屹电,可吹牛的內容都是我干的。 我是一名探鬼主播跃巡,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼危号,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瓷炮?” 一聲冷哼從身側響起葱色,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娘香,沒想到半個月后苍狰,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡烘绽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年淋昭,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片安接。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡翔忽,死狀恐怖,靈堂內的尸體忽然破棺而出盏檐,到底是詐尸還是另有隱情歇式,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布胡野,位于F島的核電站材失,受9級特大地震影響,放射性物質發(fā)生泄漏硫豆。R本人自食惡果不足惜龙巨,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一笼呆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旨别,春花似錦诗赌、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至胆屿,卻和暖如春奥喻,著一層夾襖步出監(jiān)牢的瞬間偶宫,已是汗流浹背非迹。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留纯趋,地道東北人憎兽。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像吵冒,于是被迫代替她去往敵國和親纯命。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容

  • 1.容器 1.1 stack stack是一種先進后出的數據結構痹栖,stack 模板類的定義在頭文件中亿汞。 stack...
    長江小楊閱讀 206評論 0 0
  • OOP VS GP OOP 標準庫list,里面有自己的sort揪阿,有自己sort的容器就別用全局的 list自己的...
    太帥JUE人閱讀 206評論 0 0
  • 1.容器 1.1 stack stack是一種先進后出的數據結構疗我,stack 模板類的定義在頭文件中。 stack...
    bilinbilin閱讀 285評論 0 0
  • 從三月份找實習到現在南捂,面了一些公司吴裤,掛了不少,但最終還是拿到小米溺健、百度麦牺、阿里、京東鞭缭、新浪剖膳、CVTE、樂視家的研發(fā)崗...
    時芥藍閱讀 42,271評論 11 349
  • STL(標準模板庫),是目前C++內置支持的library易结。它的底層利用了C++類模板和函數模板的機制枕荞,由三大部分...
    歲與禾閱讀 39,028評論 3 133