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