初識STL

Vector容器

1、
vector是將元素置于一個動態(tài)數(shù)組中加以管理的容器。
vector可以隨機存取元素
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,若容器變長,則以默認值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。
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支持隨機訪問迭代器。

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可以隨機存取元素(支持索引值直接存取, 用[]操作符或at()方法,這個等下會詳講)。
deque頭部和尾部添加或移除元素都非??焖?。但是在中部安插元素或移除元素比較費時。
1、#include <deque>
deque對象的默認構(gòu)造
deque采用模板類實現(xiàn),deque對象的默認構(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,若容器變長,則以默認值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。
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是堆棧容器,是一種“先進后出”的容器。
stack是簡單地裝飾deque容器而成為另外的一種容器。
1、#include <stack>
stack對象的默認構(gòu)造
stack采用模板類實現(xiàn), stack對象的默認構(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是隊列容器,是一種“先進先出”的容器。
queue是簡單地裝飾deque容器而成為另外的一種容器。
1、#include <queue>
queue對象的默認構(gòu)造
queue采用模板類實現(xiàn),queue對象的默認構(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
    }

練習Vector和deque

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

1、創(chuàng)建20名選手放到vector中;
2、遍歷vector容器,將其10個評委的打分存儲到deque中;
3、對分數(shù)進行排序,pop_back和pop_front去掉最高和最低分;
4、遍歷deque容器,取得平均值。

代碼參照deque。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容