初識STL

Vector容器

1想邦、
vector是將元素置于一個動態(tài)數(shù)組中加以管理的容器盯串。
vector可以隨機(jī)存取元素
vector尾部添加或移除元素非撤缺颍快速。但是在中部或頭部插入元素或移除元素比較費時

2娩嚼、
vector<int> vecInt; //一個存放int的vector容器。
vector<float> vecFloat; //一個存放float的vector容器滴肿。
vector<string> vecString; //一個存放string的vector容器岳悟。
//尖括號內(nèi)還可以設(shè)置指針類型或自定義類型。

3泼差、vector對象的帶參數(shù)構(gòu)造
vector(beg,end); //構(gòu)造函數(shù)將[beg, end)區(qū)間中的元素拷貝給本身竿音。注意該區(qū)間是左閉右開的區(qū)間。
vector(n,elem); //構(gòu)造函數(shù)將n個elem拷貝給本身拴驮。
vector(const vector &vec); //拷貝構(gòu)造函數(shù)

int iArray[] = {0,1,2,3,4};
vector<int> vecIntA( iArray, iArray+5 );

vector<int> vecIntB ( vecIntA.begin() , vecIntA.end() );
//用構(gòu)造函數(shù)初始化容器vecIntB
vector<int> vecIntB ( vecIntA.begin() , vecIntA.begin()+3 );
vector<int> vecIntC(3,9); //此代碼運行后春瞬,容器vecIntB就存放3個元素,每個元素的值是9套啤。

4宽气、vector的大小
vector.size(); //返回容器中元素的個數(shù)
vector.empty(); //判斷容器是否為空
vector.resize(num); //重新指定容器的長度為num,若容器變長潜沦,則以默認(rèn)值填充新位置萄涯。如果容器變短,則末尾超出容器長度的元素被刪除唆鸡。
vector.resize(num, elem); //重新指定容器的長度為num涝影,若容器變長,則以elem值填充新位置争占。如果容器變短燃逻,則末尾超出容器長度的元素被刪除。

5臂痕、vector末尾的添加移除操作
vector<int> vecInt;
vecInt.push_back(1); //在容器尾部加入一個元素
vecInt.push_back(3); //移除容器中最后一個元素
vecInt.push_back(5);
vecInt.push_back(7);
vecInt.push_back(9);
vecInt.pop_back();
vecInt.pop_back();
//{5 ,7 ,9}
6伯襟、vector的數(shù)據(jù)存取
vec.at(idx); //返回索引idx所指的數(shù)據(jù),如果idx越界握童,拋出out_of_range異常姆怪。
vec[idx]; //返回索引idx所指的數(shù)據(jù),越界時澡绩,運行直接報錯

7稽揭、迭代器基本原理
迭代器是一個“可遍歷STL容器內(nèi)全部或部分元素”的對象。
迭代器指出容器中的一個特定位置肥卡。
迭代器就如同一個指針溪掀。
迭代器提供對一個容器中的對象的訪問方法,并且可以定義了容器中對象的范圍召调。

迭代器支持的操作:
it++, ++it, it--, --it膨桥,*it蛮浑, itA = itB唠叛,
itA == itB只嚣,itA != itB
其中vector,deque支持隨機(jī)訪問迭代器艺沼。

8册舞、vector與迭代器的配合使用
vector<int> vecInt; //假設(shè)包含1,3,5,7,9元素
vector<int>::iterator it;
//聲明容器vector<int>的迭代器。
it = vecInt.begin(); // it == 1
++it; //或者it++; it == 3 障般,前++的效率比后++的效率高调鲸,前++返回引用,后++返回值挽荡。
it += 2; //
it == 7
it = it+1; //
it == 9
++it;
// it == vecInt.end(); 此時不能再執(zhí)行*it,會出錯!

正向遍歷:
for(vector<int>::iterator it=vecInt.begin(); it!=vecInt.end(); ++it)
{
int iItem = *it;
cout << iItem; //或直接使用 cout << *it;
}
這樣子便打印出1 3 5 7 9

逆向遍歷:
for(vector<int>::reverse_iterator rit=vecInt.rbegin(); rit!=vecInt.rend(); ++rit) //注意藐石,小括號內(nèi)仍是++rit
{
int iItem = *rit;
cout << iItem; //或直接使用cout << *rit;
}
此時將打印出9,7,5,3,1
注意,這里迭代器的聲明采用vector<int>::reverse_iterator定拟,而非vector<int>::iterator于微。

注意:迭代器還有其它兩種聲明方法:
vector<int>::const_iterator 與 vector<int>::const_reverse_iterator

以上兩種分別是vector<int>::iterator 與vector<int>::reverse_iterator 的只讀形式,使用這兩種迭代器時青自,不會修改到容器中的值株依。

9、vector的插入
vector.insert(pos,elem); //在pos位置插入一個elem元素的拷貝延窜,返回新數(shù)據(jù)的位置恋腕。
vector.insert(pos,n,elem); //在pos位置插入n個elem數(shù)據(jù),無返回值逆瑞。
vector.insert(pos,beg,end); //在pos位置插入[beg,end)區(qū)間的數(shù)據(jù)荠藤,無返回值

10、vector的刪除
vector.clear(); //移除容器的所有數(shù)據(jù)
vec.erase(beg,end); //刪除[beg,end)區(qū)間的數(shù)據(jù)获高,返回下一個數(shù)據(jù)的位置商源。
vec.erase(pos); //刪除pos位置的數(shù)據(jù),返回下一個數(shù)據(jù)的位置谋减。

Deque容器

deque是“double-ended queue”的縮寫牡彻,和vector一樣都是STL的容器,deque是雙端數(shù)組出爹,而vector是單端的庄吼。
deque在接口上和vector非常相似,在許多操作的地方可以直接替換严就。
deque可以隨機(jī)存取元素(支持索引值直接存取总寻, 用[]操作符或at()方法,這個等下會詳講)梢为。
deque頭部和尾部添加或移除元素都非辰バ校快速轰坊。但是在中部安插元素或移除元素比較費時。
1祟印、#include <deque>
deque對象的默認(rèn)構(gòu)造
deque采用模板類實現(xiàn)肴沫,deque對象的默認(rèn)構(gòu)造形式:deque<T> deqT;
deque <int> deqInt; //一個存放int的deque容器。
deque <float> deq Float; //一個存放float的deque容器蕴忆。
deque <string> deq String; //一個存放string的deque容器颤芬。
//尖括號內(nèi)還可以設(shè)置指針類型或自定義類型。

2套鹅、deque末尾的添加移除操作
deque.push_back(elem); //在容器尾部添加一個數(shù)據(jù)
deque.push_front(elem); //在容器頭部插入一個數(shù)據(jù)
deque.pop_back(); //刪除容器最后一個數(shù)據(jù)
deque.pop_front(); //刪除容器第一個數(shù)據(jù)

3站蝠、deque的數(shù)據(jù)存取
deque.at(idx); //返回索引idx所指的數(shù)據(jù),如果idx越界卓鹿,拋出out_of_range菱魔。
deque[idx]; //返回索引idx所指的數(shù)據(jù),如果idx越界吟孙,不拋出異常澜倦,直接出錯。
deque.front(); //返回第一個數(shù)據(jù)拔疚。
deque.back(); //返回最后一個數(shù)據(jù)

4肥隆、deque與迭代器
deque.begin(); //返回容器中第一個元素的迭代器。
deque.end(); //返回容器中最后一個元素之后的迭代器稚失。
deque.rbegin(); //返回容器中倒數(shù)第一個元素的迭代器栋艳。
deque.rend(); //返回容器中倒數(shù)最后一個元素之后的迭代器。

5句各、deque對象的帶參數(shù)構(gòu)造
deque(beg,end); //構(gòu)造函數(shù)將[beg, end)區(qū)間中的元素拷貝給本身吸占。注意該區(qū)間是左閉右開的區(qū)間。
deque(n,elem); //構(gòu)造函數(shù)將n個elem拷貝給本身凿宾。
deque(const deque &deq); //拷貝構(gòu)造函數(shù)矾屯。

6、deque的賦值
deque.assign(beg,end); //將[beg, end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身初厚。注意該區(qū)間是左閉右開的區(qū)間件蚕。
deque.assign(n,elem); //將n個elem拷貝賦值給本身。
deque& operator=(const deque &deq); //重載等號操作符
deque.swap(deq); // 將vec與本身的元素互換

7产禾、deque的大小
deque.size(); //返回容器中元素的個數(shù)
deque.empty(); //判斷容器是否為空
deque.resize(num); //重新指定容器的長度為num排作,若容器變長,則以默認(rèn)值填充新位置亚情。如果容器變短妄痪,則末尾超出容器長度的元素被刪除。
deque.resize(num, elem); //重新指定容器的長度為num楞件,若容器變長衫生,則以elem值填充新位置裳瘪。如果容器變短,則末尾超出容器長度的元素被刪除罪针。

8彭羹、deque的插入
deque.insert(pos,elem); //在pos位置插入一個elem元素的拷貝,返回新數(shù)據(jù)的位置站故。
deque.insert(pos,n,elem); //在pos位置插入n個elem數(shù)據(jù)皆怕,無返回值毅舆。
deque.insert(pos,beg,end); //在pos位置插入[beg,end)區(qū)間的數(shù)據(jù)西篓,無返回值。

9憋活、deque的刪除
deque.clear(); //移除容器的所有數(shù)據(jù)
deque.erase(beg,end); //刪除[beg,end)區(qū)間的數(shù)據(jù)岂津,返回下一個數(shù)據(jù)的位置。
deque.erase(pos); //刪除pos位置的數(shù)據(jù)悦即,返回下一個數(shù)據(jù)的位置吮成。

10、刪除區(qū)間內(nèi)的元素
deqInt是用deque<int>聲明的容器辜梳,現(xiàn)已包含按順序的1,3,5,6,9元素粱甫。
deque<int>::iterator itBegin=deqInt.begin()+1;
deque<int>::iterator itEnd=deqInt.begin()+3;
deqInt.erase(itBegin,itEnd);
//此時容器deqInt包含按順序的1,6,9三個元素。

stack容器

stack是堆棧容器作瞄,是一種“先進(jìn)后出”的容器茶宵。
stack是簡單地裝飾deque容器而成為另外的一種容器。
1宗挥、#include <stack>
stack對象的默認(rèn)構(gòu)造
stack采用模板類實現(xiàn)乌庶, stack對象的默認(rèn)構(gòu)造形式: stack <T> stkT;
stack <int> stkInt; //一個存放int的stack容器。
stack <float> stkFloat; //一個存放float的stack容器契耿。
stack <string> stkString; //一個存放string的stack容器瞒大。
...
//尖括號內(nèi)還可以設(shè)置指針類型或自定義類型。
stack的push()與pop()方法
stack.push(elem); //往棧頭添加元素
stack.pop(); //從棧頭移除第一個元素

stack<int> stkInt;
stkInt.push(1);stkInt.push(3);stkInt.pop();
stkInt.push(5);stkInt.push(7);
stkInt.push(9);stkInt.pop();
stkInt.pop();
此時stkInt存放的元素是1,5
stack對象的拷貝構(gòu)造與賦值
stack(const stack &stk); //拷貝構(gòu)造函數(shù)
stack& operator=(const stack &stk); //重載等號操作符

2搪桂、stack的大小
stack.empty(); //判斷堆棧是否為空
stack.size(); //返回堆棧的大小

    stack<int> stkIntA;
    stkIntA.push(1);
    stkIntA.push(3);
    stkIntA.push(5);
    stkIntA.push(7);
    stkIntA.push(9);

    if (!stkIntA.empty())
    {
        int iSize = stkIntA.size();     //5
    }
Queue容器

queue是隊列容器透敌,是一種“先進(jìn)先出”的容器。
queue是簡單地裝飾deque容器而成為另外的一種容器踢械。
1酗电、#include <queue>
queue對象的默認(rèn)構(gòu)造
queue采用模板類實現(xiàn),queue對象的默認(rèn)構(gòu)造形式:queue<T> queT; 如:
queue<int> queInt; //一個存放int的queue容器裸燎。
queue<float> queFloat; //一個存放float的queue容器顾瞻。
queue<string> queString; //一個存放string的queue容器。
//尖括號內(nèi)還可以設(shè)置指針類型或自定義類型德绿。

queue的push()與pop()方法
queue.push(elem); //往隊尾添加元素
queue.pop(); //從隊頭移除第一個元素

queue<int> queInt;
queInt.push(1);queInt.push(3);
queInt.push(5);queInt.push(7);
queInt.push(9);queInt.pop();
queInt.pop();
此時queInt存放的元素是5,7,9
queue對象的拷貝構(gòu)造與賦值
queue(const queue &que); //拷貝構(gòu)造函數(shù)
queue& operator=(const queue &que); //重載等號操作符

2荷荤、queue的數(shù)據(jù)存取
queue.back(); //返回最后一個元素
queue.front(); //返回第一個元素

3退渗、queue的大小
queue.empty(); //判斷隊列是否為空
queue.size(); //返回隊列的大小
queue<int> queIntA;
queIntA.push(1);
queIntA.push(3);
queIntA.push(5);
queIntA.push(7);
queIntA.push(9);

    if (!queIntA.empty())
    {
        int iSize = queIntA.size();     //5
    }

練習(xí)Vector和deque

假設(shè)有20名選手參加計算機(jī)大賽,10位評委對其進(jìn)行打分(滿分100分)蕴纳,去掉最高分和最低分会油,取其平均值。

1古毛、創(chuàng)建20名選手放到vector中翻翩;
2、遍歷vector容器稻薇,將其10個評委的打分存儲到deque中嫂冻;
3、對分?jǐn)?shù)進(jìn)行排序塞椎,pop_back和pop_front去掉最高和最低分桨仿;
4、遍歷deque容器案狠,取得平均值服傍。

代碼參照deque。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末骂铁,一起剝皮案震驚了整個濱河市吹零,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌拉庵,老刑警劉巖灿椅,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異名段,居然都是意外死亡阱扬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門伸辟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麻惶,“玉大人,你說我怎么就攤上這事信夫∏蕴#” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵静稻,是天一觀的道長警没。 經(jīng)常有香客問我,道長振湾,這世上最難降的妖魔是什么杀迹? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮押搪,結(jié)果婚禮上树酪,老公的妹妹穿的比我還像新娘浅碾。我一直安慰自己,他們只是感情好续语,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布垂谢。 她就那樣靜靜地躺著,像睡著了一般疮茄。 火紅的嫁衣襯著肌膚如雪滥朱。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天力试,我揣著相機(jī)與錄音徙邻,去河邊找鬼。 笑死懂版,一個胖子當(dāng)著我的面吹牛鹃栽,可吹牛的內(nèi)容都是我干的躏率。 我是一名探鬼主播躯畴,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼薇芝!你這毒婦竟也來了蓬抄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤夯到,失蹤者是張志新(化名)和其女友劉穎嚷缭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體耍贾,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡阅爽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了荐开。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片付翁。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖晃听,靈堂內(nèi)的尸體忽然破棺而出百侧,到底是詐尸還是另有隱情,我是刑警寧澤能扒,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布佣渴,位于F島的核電站,受9級特大地震影響初斑,放射性物質(zhì)發(fā)生泄漏辛润。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一见秤、第九天 我趴在偏房一處隱蔽的房頂上張望砂竖。 院中可真熱鬧灵迫,春花似錦、人聲如沸晦溪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽三圆。三九已至狞换,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舟肉,已是汗流浹背修噪。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留路媚,地道東北人黄琼。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像整慎,于是被迫代替她去往敵國和親脏款。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348