第二章 C++ STL 泛型編程 之deque&list&bitset

deque 雙端隊列容器

與vector一樣沼琉,采用線性表順序存儲結構灵巧。唯一不同是 deque 采用分塊的線性存儲結構來存儲數(shù)據(jù)的榛。deque 塊在頭部和尾部都可插入和刪除元素,而不需移動其他元素(使用 push_back()方法在尾部插入元素會擴張隊列套腹;而使用 push_front()方法在首部插入元素和使用 insert()方法在中間插入元素只是將原位置上的元素值覆蓋,不會增加新元素)链峭№锬粒考慮到容器元素的內存分配策略和操作的性能時 deque 相對于 vector更有優(yōu)勢通危。

deque函數(shù)

創(chuàng)建 deque 對象熄守,三種方法

  1. 創(chuàng)建沒有任何元素的 deque 對象, 如:
    deque<int> d;

  2. 創(chuàng)建具有 n 個元素的 deque 對象,如:
    deque<int> d(10); //創(chuàng)建具有 10 個整型元素的 deque 對象 d

  3. 創(chuàng)建具有 n 個元素的 deque 對象,并賦初值,如:
    deque<int> d(10,8.5); //創(chuàng)建具有 10 個整型元素的 deque 對象 d,每個元素值為 8.5

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;

int main()
{
    deque<int> d;
    //使用 push_back()方法從尾部插入元素,會不斷擴張隊列蜈垮。
    d.push_back(1);
    d.push_back(2);
    d.push_back(3);
    //以數(shù)組方式輸出元素
    cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl;

    //前向遍歷
    for(int i=0;i < d.size(); i++)
        cout<<d[i]<<" ";
    cout<<endl;

    //以前向迭代器的方式遍歷
    deque<int>::iterator it;
    for(it=d.begin();it!=d.end();it++)
        cout<<*it<<" ";
    cout<<endl;

    //反向遍歷
    deque<int>::reverse_iterator rit;
    for(rit=d.rbegin();rit!=d.rend();rit++)
        cout<<*rit<<" ";
    cout<<endl;

    //從頭部插入元素,不會增加新元素,只將原有的元素覆蓋。
    d.push_front(10);
    d.push_front(20);
    //以數(shù)組方式輸出元素
    cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl;

    //從中間插入元素,不會增加新元素,只將原有的元素覆蓋裕照。
    d.insert(d.begin() + 1, 88);
    cout<<d[0]<<" "<<d[1]<<" "<<d[2]<<endl;

    return 0;
}

刪除元素攒发,可以從雙端隊列容器的首部、尾部晋南、中部刪除元素惠猿,并可以清空雙端隊列容器。

#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;

int main()
{
    deque<int> d;
    //使用 push_back()方法從尾部插入元素,會不斷擴張隊列负间。
    d.push_back(1);
    d.push_back(2);
    d.push_back(3);
    d.push_back(4);
    d.push_back(5);

    //采用 pop_front()方法從頭部刪除元素
    d.pop_front();
    d.pop_front();
    //以前向迭代器的方式遍歷
    deque<int>::iterator it;
    for(it = d.begin(); it != d.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

    d.push_front(2);
    d.push_front(1);
    //采用 pop_back()方法從尾部刪除元素
    d.pop_back();
    for(it = d.begin(); it != d.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

    //使用 erase()方法從中間刪除元素,其參數(shù)是迭代器位置
    d.push_back(5);
    //從中間刪除元素,erase 的參數(shù)是迭代器位置
    d.erase(d.begin()+1);
    for(it = d.begin(); it != d.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

    //使用 clear()方法清空 deque 對象
    d.clear();
    //輸出元素的個數(shù)
    cout<<d.size()<<endl;

    return 0;
}

list 雙向鏈表容器

list 容器實現(xiàn)了雙向鏈表的數(shù)據(jù)結構偶妖。由于 list 對象的節(jié)點并不要求在一段連續(xù)的內存中,所以對于迭代器只能通過“++”或“- -”的操作將迭代器移動到后繼/前驅節(jié)點元素處政溃。而不能對迭代器進行+n 或-n 的操作趾访。

創(chuàng)建鏈表

//創(chuàng)建空鏈表
list<int> l;
//創(chuàng)建具有 n 個元素的鏈表
list<int> l(10);

list函數(shù)

#include <iostream>
#include <algorithm>
#include <list>
using namespace std;

int main()
{
    list<int> l;
    //1. 采用 push_back()方法往尾部插入新元素,鏈表自動擴張
    l.push_back(2);
    l.push_back(1);
    l.push_back(5);

    //2. 采用 push_front()方法往首部插入新元素,鏈表自動擴張
    l.push_front(8);

    //3. 采用 insert()方法往迭代器位置處插入新元素,鏈表自動擴張。注意,迭代器只能進行“++”或“- -”操作,不能進行+n 或-n 的操作,因為元素的位置并不是物理相連的董虱。
    list<int>::iterator it;
    it = l.begin();
    it++; //注意,鏈表的迭代器只能進行++或--操作,而不能進行+n 操作
    l.insert(it,20);
    for(it = l.begin(); it != l.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

    //反向遍歷鏈表
    list<int>::reverse_iterator rit;
    for(rit=l.rbegin();rit!=l.rend();rit++)
        cout<<*rit<<" ";
    cout<<endl;

    //找到該元素,則返回該元素迭代器位置;否則返回 end()迭代器位置
    it=find(l.begin(), l.end(), 5);
    if(it!=l.end())//找到
        cout<<"find it"<<endl;
    else
        cout<<"not find it"<<endl;

    //sort()方法可以對鏈表元素進行升序排列
    l.sort();
    for(it = l.begin(); it != l.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

     //unique()方法可以剔除連續(xù)重復元素,只保留一個
     l.push_back(2);
     l.push_back(2);
     l.push_back(9);
     l.unique();
    for(it = l.begin(); it != l.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

    //使用 remove()方法刪除鏈表中一個元素,值相同的元素都會被刪除扼鞋。
    l.push_back(2);
    l.remove(2);
    for(it = l.begin(); it != l.end(); it++)
        cout<<*it<<" ";
    cout<<endl;



    //pop_front()方法刪除鏈表首元素,使用 pop_back()方法刪除鏈表尾元素
    l.pop_front();
    l.pop_back();
    for(it = l.begin(); it != l.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

    //erase()方法刪除迭代器位置上的元素
    l.push_back(5);
    l.push_back(0);
    it=l.begin();
    it++;
    it++;
    l.erase(it);
    for(it = l.begin(); it != l.end(); it++)
        cout<<*it<<" ";
    cout<<endl;

    //使用 clear()方法清空鏈表
    l.clear();
    //打印鏈表元素個數(shù)
    cout<<l.size()<<endl;
    return 0;
}

bitset 位集合容器

bitset 容器是一個 bit 位元素的序列容器,每個元素只占一個 bit 位,取值為 0 或 1,因而很節(jié)省內存空間。


創(chuàng)建 bitset 對象時必須要指定容器的大小愤诱。bitset 對象的大小一經(jīng)定義就不能修改了云头。

bitset函數(shù)

#include <iostream>
#include <algorithm>
#include <bitset>
using namespace std;

int print(const bitset<10> &x)
{
    //下標法輸出所有元素,第 0 位是最低位,第 9 位是最高位
    for(int i = x.size() - 1; i >= 0; i--)
        cout<<x[i];
    cout<<endl;
    return 0;
}

int main()
{
    bitset<10> b;
    //1. 采用下標法設置元素值
    b[1]=1;
    b[6]=1;
    b[9]=1;
    print(b);

    //2. 采用 set(pos)方法,設置某 pos 位
    b.set(1,0);
    b.set(5,1);
    b.set(9,0);
    print(b);

    //3. 采用 set()方法,一次性將元素設置為 1
    b.set();
    print(b);

    //4. 采用 reset(pos)方法,將某 pos 位設置為 0
    b.reset(0);
    b.reset(2);
    b.reset(3);
    b.reset(4);
    b.reset(5);
    b.reset(7);
    b.reset(8);
    //直接向輸出流輸出全部元素
    cout<<b<<endl;

    return 0;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市淫半,隨后出現(xiàn)的幾起案子溃槐,更是在濱河造成了極大的恐慌,老刑警劉巖撮慨,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件竿痰,死亡現(xiàn)場離奇詭異,居然都是意外死亡砌溺,警方通過查閱死者的電腦和手機影涉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來规伐,“玉大人蟹倾,你說我怎么就攤上這事。” “怎么了鲜棠?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵肌厨,是天一觀的道長。 經(jīng)常有香客問我豁陆,道長柑爸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任盒音,我火速辦了婚禮表鳍,結果婚禮上,老公的妹妹穿的比我還像新娘祥诽。我一直安慰自己譬圣,他們只是感情好,可當我...
    茶點故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布雄坪。 她就那樣靜靜地躺著厘熟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪维哈。 梳的紋絲不亂的頭發(fā)上绳姨,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天,我揣著相機與錄音笨农,去河邊找鬼就缆。 笑死,一個胖子當著我的面吹牛谒亦,可吹牛的內容都是我干的竭宰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼份招,長吁一口氣:“原來是場噩夢啊……” “哼切揭!你這毒婦竟也來了?” 一聲冷哼從身側響起锁摔,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤廓旬,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谐腰,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體孕豹,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年十气,在試婚紗的時候發(fā)現(xiàn)自己被綠了励背。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡砸西,死狀恐怖叶眉,靈堂內的尸體忽然破棺而出址儒,到底是詐尸還是另有隱情,我是刑警寧澤衅疙,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布莲趣,位于F島的核電站,受9級特大地震影響饱溢,放射性物質發(fā)生泄漏喧伞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一绩郎、第九天 我趴在偏房一處隱蔽的房頂上張望絮识。 院中可真熱鬧,春花似錦嗽上、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至挪圾,卻和暖如春浅萧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哲思。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工洼畅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人棚赔。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓帝簇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親靠益。 傳聞我的和親對象是個殘疾皇子丧肴,可洞房花燭夜當晚...
    茶點故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內容