1. 程式人生 > >C++的STL容器之順序性容器vector、list、deque

C++的STL容器之順序性容器vector、list、deque

STL對定義的通用容器分三類:順序性容器關聯式容器容器介面卡

順序性容器:vector、list、deque

關聯性容器:set、multiset、map、multimap

容器介面卡:stack、queue、priority_queue

本篇主要總結順序性容器:

(btw:獲取迭代器的方法:建物件方式::iterator iter;  //例:vector<int>::iterator iter;  )

1.vector

vector向量是一種順序行容器。相當於陣列,但其大小可以不預先指定,並且自動擴充套件。它可以像陣列一樣被操作,由於它的特性我們完全可以將vector 看作動態陣列

當vector儲存的資料量很大時,如果此時進行插入資料導致需要更大的空間來存放這些資料量,那麼將會大大的影響程式執行的效率,所以我們應該合理的使用vector。


常用操作:

(1)初始化vector物件的方式:

vector<T> v1;     // 預設的初始化方式,內容為空

vector<T> v2(v1);   // v2是v1的一個副本

vector<T> v3(n, i)   // v3中包含了n個數值為i的元素

vector<T> v4(n);   // v4中包含了n個元素,每個元素的值都是0

(2)vector常用函式

empty():判斷向量是否為空,為空返回真,否則為假

begin():返回向量(陣列)的首元素地址

end(): 返回向量(陣列)的末元素的下一個元素的地址

clear():清空向量

front():返回得到向量的第一個元素的資料

back():返回得到向量的最後一個元素的資料

size():返回得到向量中元素的個數

push_back(資料):將資料插入到向量的尾部

pop_back():刪除向量尾部的資料

at() 返回指定位置的元素

TYPE at( size_type loc );//差不多等同v[i];但比v[i]安全;

erase() 刪除指定元素:例:vec.erase(vec.begin()+i,vec.begin()+j);刪除區間[i,j-1];區間從0開始

assign函式:

void assign(const_iterator first,const_iterator last);

void assign(size_type n,const T& x = T());

功能:將區間[first,last)的元素賦值到當前的vector容器中,或者賦n個值為x的元素到vector容器中,這個容器會清除掉vector容器中以前的內容。

2.list 連結串列

連結串列相對於vector向量來說的優點在於:(a)動態的分配記憶體,當需要新增資料的時候不會像vector那樣,先將現有的記憶體空間釋放,在次分配更大的空間,這樣的話

效率就比較低了。(b)支援內部插入、頭部插入和尾部插入

缺點:不能隨機訪問,不支援[]方式和vector.at()、佔用的記憶體會多於vector(非有效資料佔用的記憶體空間)

(1)初始化list物件的方式

list<int> L0;    //空連結串列

list<int> L1(3);   //建一個含三個預設值是0的元素的連結串列

list<int> L2(5,2); //建一個含五個元素的連結串列,值都是2

list<int> L3(L2); //L3是L2的副本

list<int> L4(L1.begin(),L1.end());    //L4含L1一個區域的元素[begin, end]。

(2)list常用函式

begin():返回list容器的第一個元素的地址

end():返回list容器的最後一個元素之後的地址

rbegin():返回逆向連結串列的第一個元素的地址(也就是最後一個元素的地址)

rend():返回逆向連結串列的最後一個元素之後的地址(也就是第一個元素再往前的位置)

front():返回連結串列中第一個資料值

back():返回連結串列中最後一個數據值

empty():判斷連結串列是否為空

size():返回連結串列容器的元素個數

clear():清除容器中所有元素

insert(pos,num):將資料num插入到pos位置處(pos是一個地址)

insert(pos,n,num):在pos位置處插入n個元素num

erase(pos):刪除pos位置處的元素

push_back(num):在連結串列尾部插入資料num

pop_back():刪除連結串列尾部的元素

push_front(num):在連結串列頭部插入資料num

pop_front():刪除連結串列頭部的元素

sort():將連結串列排序,預設升序

(3)遍歷方式

雙向連結串列list支援使用迭代器正向的遍歷,也支援迭代器逆向的遍歷,但是不能使用 [] 索引的方式進行遍歷。

3.deque 雙端佇列

(1)初始化deque物件的方式:

deque<Elem> c   ;  //產生一個空的deque,其中沒有任何元素

deque<Elem> c1(c2); //產生另一個同型deque的副本(所有元素都被拷貝)

deque<Elem> c(n) ;  //產生一個大小為n的deque

deque<Elem> c(n , elem) ;  //產生一個大小為n的deque,

                           //每個元素值都是elem。

dequer<Elem> c(begin,end); //產生一個deque,以區間[begin ; end]

                           //做為元素初值

解構函式:

c.~ deque<Elem>()   ;銷燬所有元素,並釋放記憶體。

(2)deque常用函式

非變動性操作

c.size();         //返回當前的元素數量

c.empty();       //判斷大小是否為零。等同於c.size() == 0,但可能更快

c.max_size();    //可容納元素的最大數量

c.at(idx) ;       //返回索引為idx所標示的元素。如果idx越界,丟擲out_of_range

c[idx] ;         //返回索引idx所標示的元素。不進行範圍檢查

c.front() ;       //返回第一個元素,不檢查元素是否存在

c.back();        //返回最後一個元素

c.begin();       //返回一個隨機迭代器,指向第一個元素

c.end();         //返回一個隨機迭代器,指向最後元素的下一位置

變動性操作:

c1 = c2  ;        //將c2的所有元素賦值給c1;

c.assign(n , elem);    //將n個elem副本賦值給c

c.assing(beg , end);   //將區間[beg;end]中的元素賦值給c;

c.push_back(elem);   //在尾部新增元素elem

c.pop_back()    ;    //移除最後一個元素(但不回傳)

c.push_front()   ;   //在頭部新增元素elem

c.pop_front()    ;   //移除頭部一個元素(但不回傳)

c.erase(pos)    ;   //移除pos位置上的元素,返回一元素位置

                  //如 c.erase( c.begin() + 5)  //移除第五個元素

c.insert(pos , elem); //在pos位置插入一個元素elem,並返回新元素的位置

c.insert(pos , n , elem); //在pos位置插入n個元素elem,無返回值

c.insert(pos , beg , end);

c.resize(num);       //將容器大小改為num。可更大或更小。

c.resize(num , elem);  //將容器大小改為num,新增元素都為 elem

c.clear();            //移除所有元素,將容器清空

PS:Deque和Vector是智慧容器,刪除或者增加元素時,其他位置與元素會進行相應的移動。

最好採用deque的情形:

1、需要在兩端插入和刪除元素。

2、無需引用容器內的元素。

3、要求容器釋放不再使用的元素。

deque的各項操作只有一下兩點和vector不同:

deque不提供容量操作:capacity()reverse()

deque直接提供函式完成首尾元素的插入和刪除。

其他均與vector相同。

注意:

1、除了at()函式,其他成員函式都不會檢查索引或迭代器是否有效。

2、元素的插入和刪除可能會導致記憶體重新分配。所以任何插入或刪除操作都會使所有指向deque元素的pointers、reference、iterators失效。唯一例外的是在首尾插入元素之後,pointers和reference可能仍然有效。

第二篇:C++的STL容器之關聯性容器set、multiset、map、multimap

第三篇:C++的STL容器之關聯性容器stack、queue、priority_queue

連結:https://blog.csdn.net/baodream/article/details/79732680