STL系列-----deque容器詳細說明

1、基本概念

功能:雙端數組,可以對頭端進行插入刪除操作

deque與vector區別:

vector對於頭部的插入刪除效率低,數據量越大,效率越低
deque相對而言,對頭部的插入刪除速度比vector快
vector訪問元素時的速度會比deque快,這和兩者內部實現有關

deque容器的迭代器也支持隨機訪問

2、構造函數

默認構造形式

deque<T>  deqT

構造函數將[beg,end)區間中的元素拷貝給本身。

deque(beg,end)

構造函數將n個elem拷貝給本身。

deque(n,elem)

拷貝構造函數

deque(const deque& deq)

如果要限制數據是隻讀狀態,那麼迭代器的狀態也要發生改變

#include<iostream>
using namespace std;
#include<deque>
void printDeque(const deque<int>&d)
{
 for(deque<int>::const_iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
void test01()
{
 //無參構造,默認構造 
 deque<int>d1;
    for(int i=0;i<10;i++)
    {
     d1.push_back(i);
 }
 printDeque(d1);
 //第二種
 deque<int>d2(d1.begin(),d1.end()) ;
 printDeque(d2);
 //第三種
 deque<int>d3(10,100) ;
 printDeque(d3);
 //第四種
 deque<int>d4(d3); 
 printDeque(d4);
}
int main()
{
    test01();
}

deque和vector容器構造方式幾乎一樣

3、賦值操作

重載等號操作符

vector& operator=const vector&vec)

將[beg,end)區間中的數據拷貝賦值給本身

assign(beg,end)

將n個elem拷貝賦值給本身

assign(n,elem);

代碼如下

#include<iostream>
using namespace std;
#include<deque>
void printDeque(const deque<int>&d)
{
 for(deque<int>::const_iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
void test01()
{
 deque<int>d1;
    for(int i=0;i<10;i++)
    {
     d1.push_back(i);
 }
 printDeque(d1);
 //第一種
 deque<int>d2; 
 d2=d1;
 printDeque(d2);
 //第二種 
 deque<int>d3;
 d3.assign(d1.begin(),d1.end()) ;
 printDeque(d3);
 //第三種
 deque<int>d4;
 d4.assign(10,100);
 printDeque(d4);
 
}
int main()
{
    test01();
}

4、容量、大小操作

對deque容器容量和大小判斷

判斷容器是否爲空

empty()

返回容器中元素的個數

size()

重新指定容器的長度爲num

resize(int num)

若容器變長,則以默認值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。
 

重新指定容器的長度爲num

resize(int num,elem);

若容器變長,則以elem值填充新位置。如果容器變短,則未尾超出容器長度的元素被刪除

deque沒有容量概念,但有大小概念
因爲它是一個雙端數組

代碼如下

#include<iostream>
using namespace std;
#include<deque>
void printDeque(deque<int>&d)
{
 for(deque<int>::iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
void test01()
{
 deque<int>d1;
    for(int i=0;i<10;i++)
    {
     d1.push_back(i);
 }
 printDeque(d1);
 if(d1.empty())
 {
  cout<<"d1爲空"<<endl;
 }
 else
 {
  cout<<"d1不爲空"<<endl;
  cout<<"d1的大小爲:"<<d1.size()<<endl;
 }
 //重新指定大小 
 d1.resize(15,2);
 printDeque(d1);
 d1.resize(5);
 printDeque(d1);
}
int main()
{
    test01();
}

總結:

deque沒有容量的概念

判斷是否爲空------empty

返回元素個數-----------size

重新指定個數------------resize

5、插入和刪除

向deque中插入和刪除數據

函數原型:

在容器尾部添加一個數據

push_back(elem);

在容器頭部插入一個數據

push_front(elem)

刪除容器最後一個數據

pop_back()

刪除容器第一個數據

pop_front()

指定位置操作:
在pos位置插入一個elem元素的拷貝,返回新數據的位置

insert(pos,elem)

在pos位置插入n個elem數據,無返回值。

insert(pos,n,elem)

在pos位置插入[beg.end)區間的數據,無返回值。

insert(pos,beg,end)

清空容器的所有數據

clear()

刪除[beg.end)區間的數據,返回下一個數據的位置。

erase(beg,end)

刪除pos位置的數據,返回下一個數據的位置。

erase(pos)

其中,pos都是迭代器
代碼如下

#include<iostream>
using namespace std;
#include<deque>
void printDeque(deque<int>&d)
{
 for(deque<int>::iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
//兩端操作 
void test01()
{
 deque<int> d;
 //尾插 
 d.push_back(10);
 d.push_back(20);
 //頭插 
 d.push_front(100);
 d.push_front(200);
 //200 100 10 20
 printDeque(d); 
 //尾刪
 d.pop_back();
 //200 100 10
 printDeque(d);
 //頭刪
 d.pop_front();
 //100 10
 printDeque(d);
}
void test02()
{
 deque<int> d;
 d.push_back(10);
 d.push_back(20);
 d.push_front(100);
 d.push_front(200);
 //200 100 10 20
 printDeque(d); 
 d.insert(d.begin(),1000); 
 //1000,200 100 10 20
 printDeque(d); 
 d.insert(d.begin(),2,1000); 
 //1000,1000,1000,200 100 10 20
 printDeque(d); 
 //指定位置插入區間
 deque<int> d2;
 d2.push_back(1);
 d2.push_back(2);
 d2.push_front(10);
 d2.push_front(20);
 d.insert(d.begin(),d2.begin(),d2.end());
 printDeque(d); 
}
void test03()
{
 deque<int> d;
 d.push_back(10);
 d.push_back(20);
 d.push_front(100);
 d.push_front(200);
 //200 100 10 20
 printDeque(d); 
 d.erase(d.begin());
 //100 10 20
 printDeque(d); 
 //刪除指定項
 deque<int>::iterator it=d.begin();
 it++;
 d.erase(it);
 printDeque(d); 
 //清空
 //d.clear();
 d.erase(d.begin(),d.end());
 printDeque(d); 
}
int main()
{
    //test01();
    //test02();
    test03();
}

6、數據存取

返回索引idx所指的數據

at(int idx)

返回索引idx所指的數據

operator[]

返回容器中第一個數據元素

front()

返回容器中最後一個數據元素

back()

代碼如下

#include<iostream>
using namespace std;
#include<deque>
void printDeque(deque<int>&d)
{
 for(deque<int>::iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
//兩端操作 
void test01()
{
 deque<int> d;
 d.push_back(10);
 d.push_back(20);
 d.push_front(100);
 d.push_front(200);
 printDeque(d);
 for(int i=0;i<d.size();i++)
 {
  cout<<d[i]<<" ";
 }
 cout<<endl;
 for(int i=0;i<d.size();i++)
 {
  cout<<d.at(i)<<" ";
 }
 cout<<endl;
 cout<<"第一個元素爲:"<<d.front()<<endl;
 cout<<"最後一個元素爲:"<<d.back()<<endl;
}
int main()
{
    test01();
}

7、排序

對beg和end區間內元素進行排序

sort(iterator    beg,iterator   end)

代碼如下

#include<iostream>
using namespace std;
#include<deque>
#include<algorithm>
void printDeque(deque<int>&d)
{
 for(deque<int>::iterator it=d.begin();it!=d.end();it++)
 {
  cout<<*it<<" ";
 }
 cout<<endl;
}
//兩端操作 
void test01()
{
 deque<int> d;
 d.push_back(10);
 d.push_back(20);
 d.push_front(100);
 d.push_front(200);
 printDeque(d);
 cout<<"排序後:"<<endl;
 sort(d.begin(),d.end());
 printDeque(d);
}
int main()
{
    test01();
}

默認sort都是升序排序,也可以添加函數改爲降序排序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章