C++容器和STL, since 2020-12-08

(2020.12.08 Tues)
STL容器允許重復(fù)利用已有的實(shí)現(xiàn)構(gòu)造自己特定類(lèi)型下的數(shù)據(jù)結(jié)構(gòu)咸产,通過(guò)設(shè)置一些模板類(lèi),這些模板的參數(shù)允許用戶指定容器中元素的數(shù)據(jù)類(lèi)型逸月,從而提高編程效率氧卧。

(容器部分的內(nèi)容可以對(duì)比python中的list, tuple, dict, set等數(shù)據(jù)結(jié)構(gòu)。)
容器主要由頭文件<vector>, <list>, <deque>, <set>, <map>, <stack>和<queue>組成蚜锨。

數(shù)據(jù)結(jié)構(gòu) 描述 實(shí)現(xiàn)頭文件
向量(vector) 連續(xù)存儲(chǔ)的元素 <vector>
列表(list) 由節(jié)點(diǎn)組成的雙向鏈表档插,每個(gè)結(jié)點(diǎn)包含著一個(gè)元素 <list>
雙隊(duì)列(deque) 連續(xù)存儲(chǔ)的指向不同元素的指針?biāo)M成的數(shù)組 <deque>
集合(set) 由節(jié)點(diǎn)組成的紅黑樹(shù),每個(gè)結(jié)點(diǎn)都包含著一個(gè)元素亚再,節(jié)點(diǎn)之間以某種作用于元素對(duì)的謂詞排列郭膛,沒(méi)有兩個(gè)不同的元素能夠擁有相同的次序 <set>
多重集合(multiset) 允許存在兩個(gè)次序相等的元素的集合 <set>
棧(stack) 后進(jìn)先出的值的排列 <stack>
隊(duì)列(queue) 先進(jìn)先出的值的排列 <queue>
優(yōu)先隊(duì)列(priority queue) 元素的次序是由作用于所存儲(chǔ)的值對(duì)上的某種謂詞決定的一種隊(duì)列 <queue>
映射(map) 由{鍵,值}對(duì)組成的集合,以某種作用于鍵對(duì)上的謂詞排列 <map>
多重映射(multimap) 允許鍵對(duì)有相等的次序的映射 <map>

(2020.12.09 Wed)
STL定義的通用容器分為順序容器(sequence container)氛悬,關(guān)聯(lián)容器(associative container)容器適配器则剃。

順序容器

順序容器是一種各元素間有順序關(guān)系的線性表耘柱,是線性結(jié)構(gòu)的可序群集,其中的每一個(gè)元素有固定的位置棍现,除非用刪除或插入的操作改變變量的位置调煎。順序容器具有插入速度快但查找操作相對(duì)較慢的特征。C++ STL(標(biāo)準(zhǔn)模板庫(kù))提供3中順序容器:vector己肮、list和deque士袄。vector和deque類(lèi)時(shí)以數(shù)組為基礎(chǔ),list類(lèi)是以雙向鏈表為基礎(chǔ)谎僻。

順序容器中各種類(lèi)型的比較

vector是動(dòng)態(tài)順序容器娄柳,有連續(xù)內(nèi)存地址的數(shù)據(jù)結(jié)構(gòu)。相比于數(shù)組艘绍,vector會(huì)消耗更多的內(nèi)存以有效地動(dòng)態(tài)增長(zhǎng)赤拒。而相比于其他順序容器(deques, list),vector能更快的索引元素(如同數(shù)組一樣)诱鞠,而且能相對(duì)高效的在尾部插入和刪除元素挎挖。在其他位置刪除和插入元素,效率沒(méi)有這些容器高航夺。

list是STL實(shí)現(xiàn)的雙向鏈表蕉朵,相比vector的連續(xù)線性空間,list復(fù)雜太多敷存,它允許快速的插入和刪除墓造,但是隨機(jī)訪問(wèn)卻比較慢堪伍。它的數(shù)據(jù)有若干個(gè)節(jié)點(diǎn)構(gòu)成锚烦,每個(gè)節(jié)點(diǎn)包括一個(gè)信息塊、一個(gè)前驅(qū)指針和一個(gè)后驅(qū)指針帝雇,可以向前或向后進(jìn)行訪問(wèn)涮俄,但不能隨機(jī)訪問(wèn)。好處是每次插入或刪除會(huì)配置或者釋放一個(gè)元素空間尸闸,對(duì)空間的運(yùn)用絕對(duì)精準(zhǔn)彻亲。

deque(double ended queues雙向隊(duì)列)和vector相似,但它允許在容器頭部快速插入和刪除吮廉,如同在尾部一樣苞尝。

向量vector

使用vector的時(shí)候,需包含頭文件: <vector>宦芦,一般還要加上'using namespace std;'宙址,如果不加,調(diào)用的時(shí)候必須加std::vector<..>這樣的形式调卑,加了std::表示運(yùn)用的是std命令空間的vector容器抡砂。
向量聲明和初始化

語(yǔ)句 作用
vector<元素類(lèi)型>向量對(duì)象名; 創(chuàng)建一個(gè)沒(méi)有任何元素的空向量對(duì)象
vector<元素類(lèi)型>向量對(duì)象名(size); 創(chuàng)建一個(gè)大小為size的向量對(duì)象
vector<元素類(lèi)型>向量對(duì)象名(n,初始值); 創(chuàng)建一個(gè)大小為n的向量對(duì)象大咱,并初始化
vector<元素類(lèi)型>向量對(duì)象名(begin, end); 創(chuàng)建一個(gè)向量對(duì)象,初始化該對(duì)象(begin, end)中的元素
vector<int> a;
vector<float> a(10); //初始大小為10的向量
vector<float> a(10,1);//初始大小為10注益,初始值都是1的向量
vector<int> b(a); //用向量a初始化向量b
vector<int> b(a.begin(), a.begin()+3); //將a向量中第0到第2個(gè)作為向量b的初始值
//可以用數(shù)組初始化向量
int n[] = {1,2,3,4,5};
vector<int> a(n,n+5); //n的前5個(gè)元素作為a的初值
vector<in> a(&n[1], &n[4]); //n[1]到n[4]范圍內(nèi)的元素作為向量a的初值

元素的輸入和訪問(wèn)

#include <iostream>
#include <vector>
using namespace std;
int main() 
{
    vector<int> a(10,1);
    int i;
    cout << 'initialisaiton:' << endl;
    cout << 'insert data:' << endl;
    cin >> a[2];
    cin >> a[5];
    cin >> a[8];
    cout << '賦值后遍歷:'<<endl;
    for (i = 0; i < a.size(); i++)
    { 
        cout<<a[i]<<endl; //以a[n]的方式訪問(wèn)向量的第n個(gè)元素
    }
}

基本操作

語(yǔ)句 作用
a.insert(position, value) 將數(shù)值的一個(gè)拷貝插入到有position指定的位置上碴巾,并返回新元素的位置
a.insert(position,n,value) 將數(shù)值的n個(gè)拷貝插入到position指定的位置上
a.insert(position,beg,end) 將從beg到end-1之間的所有元素的拷貝插入到a中由position指定的位置上
a.push_back(value) 在尾部插入
a.pop_back() 刪除最后元素
a.resize(num) 將元素個(gè)數(shù)改為num
a.resize(num,value) 將元素個(gè)數(shù)改為num,如果size()增加丑搔,默認(rèn)的構(gòu)造函數(shù)將這些新元素初始化(用value?)
a.clear() 刪除容器中所有元素
a.erase(position) 刪除由position指定的位置上的元素
a.erase(beg, end) 刪除beg到end-1之間的所有元素
a.empty() 判斷是否為空
a.size(), a.max_size() 向量a的大小和最大容量
a.capacity() 向量a的真實(shí)大小

以迭代器訪問(wèn)向量

vector<int> a(10,5);
vector<int>::iterator iter;
for (iter = a.begin(); it != a.end(); iter++)
{
   cout<<*iter<<endl;
}

因?yàn)榈魇且粋€(gè)定義在vector類(lèi)中的typedef厦瓢,所以必須使用容器名vector、容器元素類(lèi)型和作用域符來(lái)使用iterator啤月。

迭代器是一個(gè)指針旷痕,用來(lái)存取容器中的數(shù)據(jù)元素,因此迭代器的操作和指針的操作相同顽冶。

二維向量
vector<vector<int>> a(3,vector<int>(4)); //相當(dāng)于數(shù)組a[3][4]欺抗,都是空
vector<vector<int>> a(3, vector<int>(4,0)); //相當(dāng)于a[3][4],都是0
for(int m = 0; m < a.size(); m++) //a.size()獲取行向量大小
{
    for (int n = 0; n < a[3].size(); n++) //a[n].size()獲取向量中具體每個(gè)向量的大小
    {
        cout<<a[m][n]<<endl;
     }
}

列表list

STL實(shí)現(xiàn)的雙向鏈表,相比vector的連續(xù)線性空間强重,list復(fù)雜太多绞呈,它允許快速的插入和刪除,但是隨機(jī)訪問(wèn)卻比較慢间景。它的數(shù)據(jù)有若干個(gè)節(jié)點(diǎn)構(gòu)成佃声,每個(gè)節(jié)點(diǎn)包括一個(gè)信息塊、一個(gè)前驅(qū)指針和一個(gè)后驅(qū)指針倘要,可以向前或向后進(jìn)行訪問(wèn)圾亏,但不能隨機(jī)訪問(wèn)。好處是每次插入或刪除會(huì)配置或者釋放一個(gè)元素空間封拧,對(duì)空間的運(yùn)用絕對(duì)精準(zhǔn)志鹃。列表的定義在頭文件<list>中。
其定義方式和vector相似

list<int> lst1;
list<int> lst2(3);
list<int> lst3(3,2); //三個(gè)元素的list泽西,初始值都是2
list<int> lst4(lst2); 
list<int> lst5(lst.begin(), lst.end()); //用lst初始化lst5
lst.push_front(8); //頭部加入元素
lst.pop_front(); //頭部元素刪除
lst.push_back(xx); //尾部加入元素
lst.pop_back(); //尾部元素刪除

遍歷list

iterator begin(); //返回指向第一個(gè)元素的迭代器
iterator end();
reverse_iterator rbegin(); //返回指向第一個(gè)元素的逆向迭代器
reverse_iterator rend();
// 如下
for (list<int>::reverse_iterator rit = lst.rbegin(); rit != lst.rend(); ++rit)
{
    cout<<**rit<<endl;
}

列表容器的操作

lst.empty(); //lst為空時(shí)返回true
lst.size(); //返回list中元素的個(gè)數(shù)
lst.max_size(); //返回lst最大能容納的元素個(gè)數(shù)
//為容器添加新內(nèi)容
lst.assign(InputIterator first, InputIterator last);
lst.assign(size_type a, const value_type& val); //給lst賦值n個(gè)值為val的元素
//
list<int> lst;
list<int> lst2;
list<int> lst3;
lst.assign(5,10); //添加5元素曹铃,值為10
lst2.assign(lst.begin(), lst.end()); //用lst為lst2賦值
int a[]={1,2,3,4};
lst3.assign(a,a+4); //將a的元素都賦值給lst3

插入元素
(2020.12.10 Thur)
list中插入元素需要成員函數(shù)insert()實(shí)現(xiàn)。分為若干版本捧杉。

iterator insert(iterator position, const value& val); 
//position是要插入這個(gè)list的迭代器陕见,val是要插入的值,比如下面這個(gè)例子
list<int> lst;
list<int>::iterator it;
it = lst.begin();
lst.inset(it, 9);
iterator insert(iterator position, size_type n, const value& val);
//插入n個(gè)值為val的元素
lst.insert(it, 2, 29); //在迭代器指針it所指的位置加入2個(gè)29
template <class InputIterator>;
void insert (iterator position, InputIterator first, InputIterator last);
//first和last是選擇的把值插入到這個(gè)list中的值所在的容器的迭代器
list<int> lst;
list<int>::iterator it;
vector<int> v(2,39);
lst.insert(it, v.begin(), v.end());

刪除元素

iterator erase(iterator position);
iterator erase(iterator first, iterator last); //刪除[first, last)中的值味抖,可以不用變量接收其返回值
list<int> lst(5,10);
list<int>::iterator it1,it2;
it1 = lst.begin();
it2 = lst.end();
it1 = lst.erase(it1);
lst.erase(it1, it2);
lst.erase(lst.begin(), lst.end()); //清空l(shuí)st

雙隊(duì)列deque

deque(double ended queue)雙向隊(duì)列评甜,和vector相似,但是它允許在容器頭部快速插入和刪除仔涩,就像在尾部一樣忍坷。
deque結(jié)合了vector和list的優(yōu)缺點(diǎn),優(yōu)化了的對(duì)序列兩端元素進(jìn)行添加和刪除操作的基本序列容器。

它允許較為快速的隨機(jī)訪問(wèn)承匣,但不像vector那樣把所有的對(duì)象保存在一個(gè)連續(xù)的內(nèi)存塊蓖乘,而是采用多個(gè)連續(xù)的存儲(chǔ)塊,并且在一個(gè)映射結(jié)構(gòu)中保存對(duì)這些塊及其順序的跟蹤韧骗。向deque兩端添加或刪除元素的開(kāi)銷(xiāo)很小嘉抒,不需要重新分配空間,所以向末端添加元素比vector更高效袍暴。

關(guān)聯(lián)容器

關(guān)聯(lián)容器中的元素通過(guò)關(guān)鍵字來(lái)保存和訪問(wèn)些侍,主要有映射(map)和集合(set)兩類(lèi),支持通過(guò)鍵來(lái)高效的查找和讀取元素政模。map的元素以鍵-值對(duì)(map-value)的形式組織岗宣,鍵用作元素在map類(lèi)型下進(jìn)行索引,而值則表示所存儲(chǔ)和讀取的數(shù)據(jù)淋样。set僅包含一個(gè)鍵耗式,并有效的支持關(guān)于某個(gè)鍵是否存在的查詢。set和map類(lèi)型的對(duì)象不允許為同一個(gè)鍵添加第二個(gè)元素趁猴。如果一個(gè)鍵必須有多個(gè)實(shí)例刊咳,則需使用多重映射(multimap)或多重集合(multiset)類(lèi)型,其允許多個(gè)元素?fù)碛邢嗤逆I儡司。

(2020.12.11 Fri)

映射map

map是STL的一個(gè)關(guān)聯(lián)容器娱挨,提供一對(duì)一的數(shù)據(jù)處理能力,其元素由key和value兩個(gè)分量足成的對(duì)偶(key, value)捕犬。key唯一跷坝,給定一個(gè)key就能唯一確定一個(gè)value。map的類(lèi)型通常稱(chēng)為關(guān)聯(lián)數(shù)組碉碉,和數(shù)組很相似柴钻,但下標(biāo)是關(guān)鍵字key而非整數(shù)。map類(lèi)型定義在頭文件#include <map>中誉裆。

map是有序的且不允許重復(fù)key(關(guān)鍵字)的關(guān)聯(lián)容器顿颅。有序的實(shí)現(xiàn)時(shí)依靠關(guān)鍵字類(lèi)型中的'<'來(lái)實(shí)現(xiàn)缸濒。

#include <map>
map<key_type, value_type> tmpMap; //初始化足丢,定義一個(gè)空map
map<key_type, value_type> tmpMap{
    {key1, value1},
    {key2, value2},
    ...
};   //注意結(jié)尾有個(gè)分號(hào);
map<key_type, value_type> tmpMap(existingMap); //從已有的一個(gè)map復(fù)制過(guò)來(lái)
map<key_type, value_type> tmpMap(x, y); //x, y分別是已有map對(duì)象的迭代器范圍
map1 = map2; //直接復(fù)制
類(lèi)型別名 說(shuō)明
key_type 關(guān)鍵字類(lèi)型
value_type pair<const key_type, mapped_type>
mapped_type 關(guān)鍵字關(guān)聯(lián)的類(lèi)型
map<int, string> myMap;
myMap::value_type a; //a為pair<const int, string>類(lèi)型
myMap::key_type b; //b為int類(lèi)型
myMap::mapped_type c; //c為string類(lèi)型
pair類(lèi)型

pair標(biāo)準(zhǔn)類(lèi)型被包含在頭文件#include <utility>中,一個(gè)pair保存兩個(gè)數(shù)據(jù)成員庇配,pair是一個(gè)用來(lái)生成特定類(lèi)型的模板斩跌。當(dāng)創(chuàng)建一個(gè)pair時(shí),用戶必須提供兩個(gè)類(lèi)型名捞慌,pair的數(shù)據(jù)成員將具有對(duì)應(yīng)的類(lèi)型耀鸦。一般來(lái)說(shuō),一個(gè)pair類(lèi)型的對(duì)象,存儲(chǔ)的是一個(gè)鍵值對(duì)(key-value)袖订。

pair<string, string> a; //保存兩個(gè)string
pair<string, size_t> b; //保存一個(gè)string和size_t
pair<int, vector<int>> c; //
pair<string, string> author{'hello', 'world'}; //初始化一個(gè)pair氮帐,名author,兩個(gè)初值是hello world
pair<string, string> author('hello', world'); //同上

pair的數(shù)據(jù)成員是public洛姑,成員名為first和second上沐,用戶可以用普通的成員訪問(wèn)符'.'來(lái)進(jìn)行訪問(wèn)。

操作 說(shuō)明
pair<T1, T2> p; p的成員數(shù)據(jù)類(lèi)型分別是T1和T2楞艾,默認(rèn)初始化
pair<T1, T2> p(v1,v2); 同上参咙,使用v1,v2進(jìn)行初始化
pair<T1, T2> p = {v1, v2}硫眯; 等價(jià)上式
make_pair(v1, v2); 返回一個(gè)v1和v2初始化的pair蕴侧,其類(lèi)型由v1和v2推斷而來(lái)
p.first 返回p的first成員
p.second 返回p的second成員
p1 relop p2 執(zhí)行關(guān)系運(yùn)算,利用數(shù)據(jù)類(lèi)型中的關(guān)系運(yùn)算
p1 == p2 相等性判斷两入,必須first和second同時(shí)滿足要求
p1!=p2 不等判斷

pair對(duì)象也可以作為函數(shù)的返回净宵。

map的使用

插入數(shù)據(jù)

#include <map>
map<int, string> m;
m.insert(pair<int, string>(1,'m_first')); //插入數(shù)據(jù)
m.insert(pair<int, string>(2,'m_second'));
map<int, string>::iterator iter;
for (iter = m.begin(); iter!= m.end(); iter++)
{ 
    cour<< iter->first << ' '<< iter->second<< endl;
}

插入value_type數(shù)據(jù),value_type類(lèi)型代表的是這個(gè)容器中元素的類(lèi)型

map<string, string> m;
m.insert(map<string, string>::value_type('001', 'm_first')); //插入第一個(gè)value_type數(shù)據(jù)
m.insert(map<string, string>::value_type('002', 'm_second')); //插入第二個(gè)value_type數(shù)據(jù)

用key鍵為map賦值

map<string, string> m;
m['both'] = 1;
int a = m['both'];

其他指令

m.size(); //map m的數(shù)據(jù)數(shù)量
 //遍歷裹纳,正向
for (map<int, string>::iterator iter = m.begin(); iter!=m.end() ; iter++)
{
    cout<<iter->first << ' ' << iter->second<< endl;
}
 //遍歷塘娶,反向
for (map<int, string>::iterator iter = m.rbegin(); iter!=m.rend() ; iter++)
{
    cout<<iter->first << ' ' << iter->second<< endl;
}
//計(jì)數(shù)和查找
m.count(k); //m中key k的個(gè)數(shù),0或者1
m.find(k); //找到m中的k索引的元素痊夭,并返回指向該元素的迭代器
//刪除
m.erase(k); //刪除key為k的元素刁岸,返回size_type的類(lèi)型,表示刪除的元素個(gè)數(shù)
m.erase(b, e); //刪除迭代器b和e中間的元素她我,返回void型
m.erase(p); //刪除迭代器p指向的元素虹曙,返回void型
set類(lèi)容器

set只是單純的key的集合。當(dāng)只想知道一個(gè)key是否存在時(shí)番舆,使用set容器最合適酝碳。set容器支持大多數(shù)map的操作,但不支持下標(biāo)操作恨狈,沒(méi)有定義mapped_type類(lèi)型疏哗。在set類(lèi)型中,value_type不是pair類(lèi)型禾怠,而是與key_type類(lèi)型相同返奉。set容器中存儲(chǔ)的key也是唯一的。

#include <set>
vector<int> ivec;
for (...)
{ ivec.push_back(...);}
set<int> iset(ivec.begin(), ivec.end());
cout<<iset.size()<<endl; //返回set的尺寸
iset.insert('the'); // 添加元素
iset.find('a');
iset.count('a');

容器適配器

用基本容器實(shí)現(xiàn)新的容器吗氏,用于描述更高級(jí)的數(shù)據(jù)結(jié)構(gòu)芽偏。

容器適配器有三種stack, queue和priority_queue。默認(rèn)情況下stack衍生自deque弦讽。queue也同樣來(lái)自deque污尉。

種類(lèi) 默認(rèn)順序容器 可用順序容器 說(shuō)明
stack deque vector, list, deque
queue deque list, deque 基礎(chǔ)容器必須提供push_front()計(jì)算
priority_queue vector vector, deque 基礎(chǔ)容器必須提供隨機(jī)訪問(wèn)功能
#include <stack>
#include <queue> //調(diào)用queue和priority_queue時(shí)需要引入

stack的成員函數(shù)中,s.pop()是刪除棧頂元素,s.push()是在棧頂插入元素被碗,s.top()獲得指向棧頂元素的引用某宪。

queue的成員函數(shù)中,q.push()向隊(duì)尾插入一個(gè)元素锐朴,q.pop()從隊(duì)首刪除元素缩抡,q.front()返回指向隊(duì)首元素的引用,q.back()指向隊(duì)尾元素的引用包颁。

priority_queue與queue的不同之處在于瞻想,包含最大值的元素位于隊(duì)首,且只能在隊(duì)首執(zhí)行操作娩嚼。

#include <queue>
priority_queue<int> q;
q.push(1); //插入一個(gè)元素
q.pop(); //刪除隊(duì)首的元素蘑险,即最大的元素
q.size();
q.empty();
q.top(); //隊(duì)列中最大元素的引用

容器的選擇

  1. vector的特點(diǎn)
    • 指定一塊如同數(shù)組一樣的連續(xù)存儲(chǔ),但空間可以動(dòng)態(tài)擴(kuò)展岳悟。它可以像數(shù)組一樣操作佃迄,并可以動(dòng)態(tài)操作。通常體現(xiàn)在push_back()和pop_back()
    • 隨機(jī)訪問(wèn)方便贵少,像數(shù)組一樣被訪問(wèn)
    • 節(jié)省空間呵俏,因連續(xù)存儲(chǔ),在存儲(chǔ)數(shù)據(jù)的區(qū)域都是沒(méi)有被浪費(fèi)的滔灶,但是要明確一點(diǎn)普碎,vector大多情況下并不是滿存的,在未存儲(chǔ)的區(qū)域?qū)嶋H是浪費(fèi)
    • 在內(nèi)部進(jìn)行插入录平、刪除操作效率非常低麻车,基本上是被禁止的。vector被設(shè)計(jì)成只能在后端進(jìn)行追加和刪除操作斗这,原因是vector內(nèi)部的實(shí)現(xiàn)是按照順序表的原理
    • 只能在vector的最后進(jìn)行push和pop动猬,不能在頭進(jìn)行這個(gè)操作
    • 動(dòng)態(tài)添加的數(shù)據(jù)超過(guò)vector默認(rèn)分配的大小時(shí),需要對(duì)內(nèi)存重新分配表箭、拷貝和釋放赁咙,這個(gè)操作消耗性能。達(dá)到最佳性能免钻,最好創(chuàng)建vector時(shí)指定空間大小
  2. list的特點(diǎn)
    • 不使用連續(xù)的內(nèi)存空間彼水,可以隨意進(jìn)行動(dòng)態(tài)操作
    • 可以再內(nèi)部任何位置快速的插入和刪除,可在兩端進(jìn)行push和pop
    • 不能進(jìn)行內(nèi)部的隨機(jī)訪問(wèn)
    • 比vector占用更多內(nèi)存
  3. deque的特點(diǎn)
    • 隨機(jī)訪問(wèn)方便伯襟,支持[ ]操作符猿涨,性能沒(méi)有vector好
    • 可在內(nèi)部進(jìn)行插入和刪除操作,性能不及l(fā)ist
    • 可以在兩端進(jìn)行push和pop
  4. vector/list/deque三者比較
    vector查詢性能最好姆怪,在末端增加數(shù)據(jù)的性能也好,除非它重新申請(qǐng)內(nèi)存段;適合高效的隨機(jī)存儲(chǔ)稽揭。
    list的插入和刪除元素的性能最好俺附,查詢性能差;適合大量的插入和刪除操作且不關(guān)心隨機(jī)存儲(chǔ)的需求溪掀。
    deque介于兩者之間事镣,比list更好查詢,比vector更好插入和刪除揪胃。如果用戶需要隨機(jī)存儲(chǔ)又關(guān)心兩端數(shù)據(jù)的插入和刪除璃哟,deque最佳。

Reference

  1. 聚慕課教育研發(fā)中心 編著喊递,C++從入門(mén)到項(xiàng)目實(shí)踐(超值版)随闪,清華大學(xué)出版社
  2. 劉蕾編著,21天學(xué)通C++(第五版)骚勘,電子工業(yè)出版社
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铐伴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俏讹,更是在濱河造成了極大的恐慌当宴,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泽疆,死亡現(xiàn)場(chǎng)離奇詭異户矢,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)殉疼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)逗嫡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人株依,你說(shuō)我怎么就攤上這事驱证。” “怎么了恋腕?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵抹锄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我荠藤,道長(zhǎng)伙单,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任哈肖,我火速辦了婚禮吻育,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淤井。我一直安慰自己布疼,他們只是感情好摊趾,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著游两,像睡著了一般砾层。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贱案,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天肛炮,我揣著相機(jī)與錄音,去河邊找鬼宝踪。 笑死侨糟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瘩燥。 我是一名探鬼主播秕重,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼颤芬!你這毒婦竟也來(lái)了悲幅?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤站蝠,失蹤者是張志新(化名)和其女友劉穎汰具,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體菱魔,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡留荔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澜倦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聚蝶。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖藻治,靈堂內(nèi)的尸體忽然破棺而出碘勉,到底是詐尸還是另有隱情,我是刑警寧澤桩卵,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布验靡,位于F島的核電站,受9級(jí)特大地震影響雏节,放射性物質(zhì)發(fā)生泄漏胜嗓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一钩乍、第九天 我趴在偏房一處隱蔽的房頂上張望辞州。 院中可真熱鬧,春花似錦寥粹、人聲如沸变过。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)牵啦。三九已至亚情,卻和暖如春妄痪,著一層夾襖步出監(jiān)牢的瞬間哈雏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工衫生, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留裳瘪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓罪针,卻偏偏與公主長(zhǎng)得像彭羹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子泪酱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容