首頁 > 軟體

C++ 基礎函數的介紹及使用(Vector+deque+STL)

2022-06-28 18:06:02

一、Vector的基礎函數

之前有學習過 vector、set、map等容器,都是需要什麼搜什麼,沒有詳細的瞭解其中的內容。最近在看 STL 的相關內容,就順手整理一些基礎性內容,避免以後遇到的時候再臨時抱佛腳。

1. 建構函式

vector<T> v;     //建立一個空的vector
vector<T> v(int nSize, const t& t);     //建立一個vector,元素個數為nSize,元素值均為t
vector<T> v(int nSize);     //建立一個vector,元素個數為nSize
vector<T> v(const vector&);     //複製建構函式
vector<T> v = vector(begin,end);     //複製[begin,end]範圍內另一個陣列的元素到 v中

2. 增加元素

v.push_back(const T& x);     //在vector尾部增加一個元素x
v.insert(iterator it, const T& x);     //在vector中迭代器指向的元素前插入一個元素x
v.insert(iterator it, int n,const T& x);     //在vector中迭代器指向的元素前插入n個相同的元素x
v.insert(iterator it,const_iterator first,const_iterator last);     //在vector中迭代器指向的元素前插入另一個相同型別vector中[first,last]間的元素

3. 刪除元素

v.erase(iterator it);     //刪除vector中迭代器指向的元素
v.erase(iterator first, iterator last);     //刪除vector中[first,last)的元素
v.pop_back();     //刪除vector中的最後一個元素
v.clear();     //清空向量中的所有元素

4. 遍歷vector

v.at(int nPos);     //返回nPos位置元素
v.front();     //返回vector的首元素
v.back();     //返回vector的尾元素
v.begin();     //返回指向第一個元素的迭代器
v.end();     //返回指向最後一個元素下一位置的迭代器
v.rbegin();     //反向迭代器,指向最後一個元素
v.rend();     //反向迭代器,指向第一個元素的前一個位置

5. 判斷函數

v.empty();     //判斷vector是否為空

6. 大小函數

v.size();     //返回vector中元素個數
v.capacity();     //返回當前vector中所能容納的最大元素個數
v.max_size();     //返回當前vector最大可允許的元素數量個數

7. 其他函數

v.swap(vector& v2);     //交換兩個同型別的vector
v.assign(int n,const T& t);     //設定vector中第n個元素的值為t
v.assign(const_iterator first,const_iterator last);     //vector中[first,last)中的元素設定成當前vector元素

二、deque的介紹及使用

deque(double ended queue) 作為雙端佇列,不論在尾部或頭部插入元素,都十分便捷。而在中間插入元素會比較費時,因為必須移動中間其他的元素。

雙端佇列是一種隨機存取的資料型別,提供了在序列兩端快速插入和刪除的功能,它可以在需要的時候改變自身大小,完成了標準 C++ 資料結構中佇列的所有功能。

三、deque 和 vector的差別

  • deque 則是一種雙向開口的連續線性空間,vector是單向開口的連續線性空間。
  • deque 物件在佇列的兩端插入和刪除元素比較高效,vector 在序列末尾插入和刪除元素比較高效。
  • deque 允許在常數時間內在序列頭部進行元素的插入和刪除操作,並且 deque 沒有所有的 capacity() 觀念,它是動態地以分段連續空間組合而成,隨時可以增加一段新的空間並連結起來。vector會因舊空間不足而重新設定一塊更大空間,然後複製元素,再釋放舊空間,即空間預留機制。

雖然 deque 也提供 Random Access Iterator,但它的迭代器並不是普通的指標,複雜度較高。因此除非必要,應儘可能選擇使用 vector 而非 deque。對 deque 的排序操作,可以先完整複製到一個 vector 中,使用 STL 中的排序操作對 vector 排序後,再複製回 deque。

deque 通常由一些獨立的區塊組成,第一個區塊朝某方向擴充套件,最後一個區塊朝另一方向擴充套件。它允許較為快速地隨機存取,但不像 vector 一樣把所有物件儲存在一個連續的記憶體塊,而是多個連續的記憶體塊,並且在一個對映結構中儲存對這些塊以及順序的跟蹤。

1、建構函式

#include<deque>
deque<type> deq;            //宣告一個元素型別為 type 的雙端佇列 deq
deque<type> deq(nSize);            //宣告含有 nSize 個預設初始化元素的 deq
deque<type> deq(nSize, value)            //宣告含有 nSize 個值為 value 的元素的deq
deque<type> deq(MyDeque);            //複製MyDeque到deq
deque<type> deq(first, last);            //使用迭代器first,last範圍內的元素初始化deq

2、常用成員函數

deq[nPos];            //存取雙向序列中 nPos 位置上的元素
deq.front();            //返回第一個元素
deq.back();            //返回最後一個元素
deq.push_front(x);            //把元素 x 插入到 deq 的頭部
deq.pop_front();            //彈出 deq 的第一個元素
deq.push_back(x);            //把元素 x 插入到 deq 的尾部
deq.pop_back();            //彈出 deq 的最後一個元素

3、特點

  • 支援使用 [] 和 at() 進行隨機存取,但效能沒有 vector 好;
  • 可以在內部進行插入和刪除操作,但效能沒有 list 好;
  • deque 的元素存取和迭代器操作會稍微較慢,因為內部結構中多一個間接過程;
  • deque 的迭代器是一種特殊的智慧指標,能夠在不同區塊之間跳轉;
  • deque 不支援對容量和記憶體分配時機的控制。
  • deque 的記憶體重分配優於 vector,因為其內部不需要複製所有元素。
  • deque 的記憶體塊不再被使用時,會被釋放。但是該機制由實際操作版本控制是否執行。

四、STL中容器的通用操作函數

最近在學習 C++ 中 STL 標準庫中的東西,關於list、vector、deque、set、map等容器的操作函數中存在一些通用函數,整理出來一起學習。

1. 建構函式

ContType<T> C;            //建立一個空容器
ContType<T> C(nSIze);        //建立一個含有 nSize 個預設元素的容器
ContType<T> C(nSize, Value);    //建立一個含有 nSize 個值為 Value 的元素的容器
ContType<T> C1(C2);  //複製一個同型別容器
ContType<T> C(first, last);      //複製[first,last)範圍內的元素到新容器中
C.~ContType();            //刪除所有元素,釋放記憶體

2. 判斷函數

C.empty();            //判斷容器是否為空
C1==C2;            //判斷c1是否等於c2

3. 存取函數

lst.get_allocator();        //返回容器的記憶體模型
C.begin();        //正向迭代器,指向第一個元素
C.end();         //正向迭代器,指向最後一個元素的下一位置
C.rbegin();     //反向迭代器,指向最後一個元素
C.rend();      //反向迭代器,指向第一個元素的前一個位置
C.size();      //返回容器當前儲存的元素數量
C.max_size();  //返回容器能容納的最大元素數量

4. 賦值函數

C1=C2;//將c2的值賦給c1

//swap()交換函數
C1.swap(C2);//交換c1和c2的資料
Swap(C1,C2);//同上

//assign()賦值函數
C.assign(size_type nSize, const_type Value);        //將list中元素替換為 nSize 個值為 Value 的元素
C.assign(iterator first,iterator last);        //將[first,last)中的元素複製到當前容器中
C.assign(ContType<T> &C2);           //將另一個容器中的元素複製到當前容器中

5. 操作函數

C.clear();//清空容器

//insert()插入元素
C.insert(iterator iter, const_type Value);//在 iter 指向的位置插入值為 Value的元素
C.insert(iterator iter,size_type num, const_type &Value);//在 iter 指向的位置插入 num 個值為 Value的元素
C.insert(iterator iter,iterator fisrt,last);//在 iter 指向的位置插入[first,end)區間內的所有元素

//erase()刪除元素
C.erase(nPos,nSize);//刪除從下標 nPos 開始的 nSize 個元素
C.erase(iterstor iter);//刪除該迭代器指向的元素
C.erase(iterator first,iterator lase);//刪除[first,last)區間的元素

//vector、deque、list
C.front();        //返回第一個元素
C.back();        //返回最後一個元素
C.resize();        //改變list的大小
//deque、list
C.pop_front();        //刪除第一個元素
C.push_front(Value);        //在容器頭部新增一個元素Value
//vector、deque、list
C.front();               //返回第一個元素
C.back();               //返回最後一個元素
C.resize();             //改變list的大小
C.pop_back();           //刪除最後一個元素
C.push_back(Value);     //在容器末尾新增一個元素Value
//vector、list
C.reverse();        //把list中的元素反轉

到此這篇關於C++ 基礎函數的介紹及使用(Vector+deque)的文章就介紹到這了,更多相關C++ deque Vector內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com