學(xué)完c++快一年了,,感覺很有遺憾,因?yàn)橐恢睕]有感覺到c++的強(qiáng)大之處,,當(dāng)時(shí)最大的感覺就是這個(gè)東西的輸入輸出比C語言要簡單好寫,。 后來我發(fā)現(xiàn)了qt,opencv,,opengl,原來,,c++好玩的狠,。 在這些圖形庫之外,最常用的可能就是STL,,這個(gè)東西由于當(dāng)時(shí)學(xué)c++的時(shí)候迷迷糊糊,,完全是一頭霧水,上學(xué)期數(shù)據(jù)結(jié)構(gòu)之后開始有點(diǎn)兒開竅了,,現(xiàn)在把才c++STL中常用的函數(shù),,用法貼一下,也是記錄一下,,希望能給一樣迷糊的盆友們一些幫助,。
整理自《ACM程序設(shè)計(jì)》
迭代器(iterator) 個(gè)人理解就是把所有和迭代有關(guān)的東西給抽象出來的,,不管是數(shù)組的下標(biāo),指針,,for里面的,、list里面的、vector里面的,,抽象一下變成了iterator View Code
求和(<numeric> accumulate) accumulate(v.begin(),v.end(),0),把從 v.begin() 開始到 v.end()結(jié)束所有的元素加到 0上面去 View Code
vector(動(dòng)態(tài)數(shù)組) vector有內(nèi)存管理的機(jī)制,,也就是說對(duì)于插入和刪除,vector可以動(dòng)態(tài)調(diào)整所占用的內(nèi)存空間,。 vector相關(guān)函數(shù) View Code
reverse(v.begin(),v.end()) View Code
排序(<algorithm> sort) sort(v.begin(),v.end()) View Code
字符串(<string>) 輸入 View Code
尾部添加字符字符串直接用+號(hào) 例如: s += 'a'; s += "abc",或者使用append方法,,s.append(“123”) 刪除 (erase clear) s.erase(it + 1,it + 4); clear() View Code
查找(find) 用find找到string里面第一個(gè)要找到元素(char或者串),找到返回?cái)?shù)組下標(biāo),,找不到返回end()迭代器 string和vector有很多相同的東西,,比如length(),size(),,empty(),,reverse(),相對(duì)也容易,,就不一一說了,。 數(shù)字化處理(string) 經(jīng)常會(huì)遇到這樣一種情況,有一個(gè)數(shù)字,,需要把每一位給提取出來,,如果用取余數(shù)的方法,花費(fèi)的時(shí)間就會(huì)很長,,所以可以當(dāng)成字符串來處理,,方便、省時(shí),。 例子:求一個(gè)整數(shù)各位數(shù)的和 View Code
string與char *
View Code
sscanf
View Code
string與數(shù)值相互轉(zhuǎn)換( sprintf <sstream> ) View Code
set容器 set是用紅黑樹的平衡二叉索引樹的數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)的,,插入時(shí),它會(huì)自動(dòng)調(diào)節(jié)二叉樹排列,,把元素放到適合的位置,,確保每個(gè)子樹根節(jié)點(diǎn)的鍵值大于左子樹所有的值、小于右子樹所有的值,,插入重復(fù)數(shù)據(jù)時(shí)會(huì)忽略,。set迭代器采用中序遍歷,檢索效率高于vector,、deque,、list,并且會(huì)將元素按照升序的序列遍歷,。set容器中的數(shù)值,,一經(jīng)更改,,set會(huì)根據(jù)新值旋轉(zhuǎn)二叉樹,以保證平衡,,構(gòu)建set就是為了快速檢索(python中的set一旦建立就是一個(gè)常量,,不能改的)。 multiset,,與set不同之處就是它允許有重復(fù)的鍵值,。 正反遍歷,迭代器iterator,、reverse_iterator View Code
自定義比較函數(shù),,insert的時(shí)候,set會(huì)使用默認(rèn)的比較函數(shù)(升序),,很多情況下需要自己編寫比較函數(shù),。 1、如果元素不是結(jié)構(gòu)體,,可以編寫比較函數(shù),,下面這個(gè)例子是用降序排列的(和上例插入數(shù)據(jù)相同): View Code
2、元素本身就是結(jié)構(gòu)體,,直接把比較函數(shù)寫在結(jié)構(gòu)體內(nèi)部,,下面的例子依然降序: View Code
multiset與set的不同之處就是key可以重復(fù),以及erase(key)的時(shí)候會(huì)刪除multiset里面所有的key并且返回刪除的個(gè)數(shù),。 map map也是使用紅黑樹,,他是一個(gè)鍵值對(duì)(key:value映射),便利時(shí)依然默認(rèn)按照key程序的方式遍歷,,同set,。 View Code
用map實(shí)現(xiàn)數(shù)字分離 string --> number 之前用string進(jìn)行過數(shù)字分離,現(xiàn)在使用map View Code
number --> string View Code
multimap multimap由于允許有重復(fù)的元素,,所以元素插入,、刪除、查找都與map不同,。 插入insert(pair<a,b>(value1,value2)) View Code
至于刪除和查找,,erase(key)會(huì)刪除掉所有key的map,查找find(key)返回第一個(gè)key的迭代器 deque deque和vector一樣,采用線性表,,與vector唯一不同的是,,deque采用的分塊的線性存儲(chǔ)結(jié)構(gòu),,每塊大小一般為512字節(jié),,稱為一個(gè)deque塊,所有的deque塊使用一個(gè)Map塊進(jìn)行管理,,每個(gè)map數(shù)據(jù)項(xiàng)記錄各個(gè)deque塊的首地址,,這樣以來,,deque塊在頭部和尾部都可已插入和刪除元素,而不需要移動(dòng)其它元素,。使用push_back()方法在尾部插入元素,,使用push_front()方法在首部插入元素,使用insert()方法在中間插入元素,。一般來說,,當(dāng)考慮容器元素的內(nèi)存分配策略和操作的性能時(shí),deque相對(duì)vectore更有優(yōu)勢(shì),。(下面這個(gè)圖,,我感覺Map塊就是一個(gè)list< map<deque名字,deque地址> >) 插入刪除 遍歷當(dāng)然可以使用下標(biāo)遍歷,,在這里使用迭代器,。 View Code
list list<int> l 插入:push_back尾部,push_front頭部,,insert方法前往迭代器位置處插入元素,,鏈表自動(dòng)擴(kuò)張,迭代器只能使用++--操作,,不能用+n -n,,因?yàn)樵夭皇俏锢硐噙B的。 遍歷:iterator和reverse_iterator正反遍歷 刪除:pop_front刪除鏈表首元素,;pop_back()刪除鏈表尾部元素,;erase(迭代器)刪除迭代器位置的元素,注意只能使用++--到達(dá)想刪除的位置,;remove(key) 刪除鏈表中所有key的元素,,clear()清空鏈表。 查找:it = find(l.begin(),l.end(),key) 排序:l.sort() 刪除連續(xù)重復(fù)元素:l.unique() 【2 8 1 1 1 5 1】 --> 【 2 8 1 5 1】 bitset 從來沒用過,,上兩幅圖吧就: stack(后進(jìn)先出) 這個(gè)印象深刻,,學(xué)數(shù)據(jù)結(jié)構(gòu)的時(shí)候做表達(dá)式求值的就是用的棧。 View Code
stack然我唯一費(fèi)解之處在于,,貌似它沒有iterator,,可以試試s.begin()編譯器報(bào)錯(cuò)的。 queue(先進(jìn)先出) queue有入隊(duì)push(插入),、出隊(duì)pop(刪除),、讀取隊(duì)首元素front、讀取隊(duì)尾元素back,、empty,,size這幾種方法 priority_queue(最大元素先出)
View Code
重載操作符同set重載操作符。 原文地址:http://www.cnblogs.com/duoduo369/archive/2012/04/12/2439118.html |
|