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。