C++標準模板庫:06---順序容器deque

deque

 

一、特點

  • 總的來說:雙端隊列。支持快速隨機訪問。在頭尾插入/刪除速度很快
  • deque是非常複雜的數據結構,由多個vector組成,迭代器使用時會在不同的區間跳轉
  • 存取元素的時候,deque的內部結構會多出一個間接過程,相比vector操作會慢一些
  • 對內存有限制的系統中,deque比vector可以包含更多元素,因爲它不止使用一塊內存

什麼時候使用deque

  • 需要在兩端進行插入刪除操作

 

二、頭文件、using聲明

  • 頭文件:#include <deque>
  • using聲明:using std::deque;

 

三、初始化

  • deque<T>  v1; ==>v1是一個空的deque
  • deque<T> v2(v1); ===>v2是v1的副本,拷貝構造
  • deque<T> v2=v1; ===>同上
  • deque<T> v1(n,val); ===>初始化n個value
  • deque<T> v1(iter1,iter2); ===>用迭代器iter1與iter2所指的區間內元素進行初始化
  • deque<T> v1(n); ===>初始化n個元素,每個元素使用默認值(int爲0,string爲空...)
  • deque<T> v1{a,b,c...}; ===>用元素a,b,c進行初始化
  • deque<T> v1={a,b,c...}; ===>同上

 

四、相關操作

1.運算符

d1==d2;//判斷d1和d2是否相等
d1!=d2;//判斷d1和d2是否相等
>、>=、<、<= //以字典順序進行比較

2.取值

  • 索引取值:d[0],d[1],d[2]....

 

五、相關函數

  • 相比於vector:deque不支持capacity()和reserve();。支持push_front();和emplace_front();
d.empty();//判斷是否爲空,返回布爾值
d.size();//返回容器中的元素個數
d.max_size();//返回容器的容量
d.front();//得到頭元素
d.back();//得到尾元素
d.at(int i);//得到下標i處的元素,若下標越界,會拋出異常
d1.swap(d2);//將d1和d2進行交換。容器的成員函數版本
swap(d1,d2);//同上。系統函數版本

d.assign(iter1,iter2);//將容器元素更換爲一個迭代器的區間元素
d.assign(n,t);//將容器元素變爲n個t元素
d.insert(iter,t);//在迭代器iter處插入t。返回所插位置處的迭代器
d.insert(v.end(),10,t);//在容器v的末尾插入10個元素,每個元素都是t。返回新添加元素的第一個元素的迭代器
d.insert(v.end(),{"a","b"...});//將後面花括號的每個元素插入容器v的尾部。返回新添加元素的第一個元素的迭代器
d.insert(d.begin(),d2.end()-2,d2.end());//將容器d2的最後兩個元素插入容器d的頭部。返回新添加元素的第一個元素的迭代器
注意:上面這個用法,後面兩個參數不能爲自身容器的範圍(d.insert(d.begin(),d.end()-2,d.end());是錯誤的)


//利用insert的返回值,下面代碼爲一直在d容器的頭部插入元素(類似於push_front的功能)
deque<string> d;
auto iter=d.begin();
while(cin>> word)
    iter=d.insert(iter,word);//insert函數每回執行完,返回容器的首元素位置
d.push_back(t);//尾部追加元素t
d.push_front(t);//頭部追加元素t
d.pop_back();//刪除尾元素

d.earse(iter);//刪除迭代器iter所指位置處的元素。返回刪除位置處後一個元素迭代器
d.erase(iter1,iter2);//刪除迭代器iter1與iter2區間內的元素。返回刪除最後一個元素的後一個元素迭代器

d.clear();//清空容器,重新初始化容器
d.resize(n);//將容器d的元素變爲n個。若n<原始元素個數,刪除多於元素。若n>原始元素個數,則用默認初始值初始化容器
d.resize(n,t);//將容器元素變爲n個t。與容器原始個數無關

deque<int> d(5,666);
d.resize(3);//d內有3個元素,都是666
d.resize(8);;//d內有8個元素,前5個個是666,後3個都是0(默認)
d.resize(10,666);//d內有10個元素,都是666
//下面的兩個函數,是在在內存中創建一個對象,然後添加進相應的位置
d.empalce(iter,args);//在容器d的位置添加創建一個args對象
d.emplace_back(args);//在容器d的尾部添加創建一個args對象
d.emplace_front(args);//在容器d的頭部添加創建一個args對象

例如
class A{
    string name;int age;
public:
    A(string name, int age);
};
int main()
{
    deque<A> d;
    d.emplace_back("C語言", 18);//在尾部創建一個元素
    d.emplace(v.begin(),"C++",18);//在容器d的頭部添加一個元素
}

 

六、容器操作使迭代器、引用、指針失效

1.概念:向容器中添加或者刪除元素可能會使容器的迭代器、引用、指針失效。失效的迭代器、引用、指針不再表示任何元素,使用起來非常危險

2.添加元素

  • 如果添加到首尾元素之外的任何位置都會導致迭代器、引用、指針失效
  • 如果在首尾位置添加元素,迭代器會失效,但是引用、指針不會失效

3.刪除元素

  • 如果刪除的是首尾之外的元素,那麼指向被刪除元素外的其它元素的迭代器、引用、指針都會失效
  • 如果刪除的是首元素,迭代器、引用、指針不受影響
  • 如果刪除的是尾元素,尾後迭代器失效,但其它迭代器、指針、引用都不受影響 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章