【C++自學筆記】STL—詳細理解deque

一、deque的介紹

1、deque是一種動態大小的雙端隊列,屬於序列式容器,兩端均可伸縮;

2、特定的庫可以以不同的方式實現deque ,但是通常都是一種動態數組,不論任何情況下,它都允許通過隨機訪問迭代器的方式直接訪問單個元素,可以根據需要動態伸縮;

3、deque 提供了一些與 vector 類似的功能,但是 deque 在頭部和尾部的插入過程中效率更高,與 vector 不同的是,deque 不能保證所有的元素存儲在連續空間中,在 deque 中通過指針加偏移量的方式訪問元素可能會導致非法操作;

4、vector 與 list 提供了一些類似的接口,但是內部實現原理不同:vector 使用了動態數組,deque 中的元素可能分散在不同的存儲塊中,在deque中保存了一些必要的信息,通常用來在常數範圍內直接訪問 deque的任何一個元素, 所以deque 的內部實現比 vector 複雜;

5、除了在頻繁的頭、尾插入和刪除外,deque 比list 和 forward_list性能更差; 

二、deque的使用

1、deque的構造

函數聲明 接口說明

deque()

構造空的雙端隊列

deque(size_type n,const value_type& val = value_type())

用n個val來構造雙端隊列

deque(Inputlterator first,Inputlterator last) 用[first,last)區間裏構造
deque(const deque& x) 拷貝構造

 

void MakeDequeTest() {
	deque<int> d1;
	deque<int> d2(5);
	deque<int> d3(5, 5);

	vector<int> v{ 9,5,2,7 };
	deque<int> d4(v.begin(),v.end());
	deque<int> d5(d4);

	PrintDeque(d1);
	PrintDeque(d2);
	PrintDeque(d3);
	PrintDeque(d4);
	PrintDeque(d5);
}

2、deque的迭代器

雙端隊列底層是一段假象的連續空間,實際上是分層的,爲了維護其假象,落在了deque的迭代器上;

函數聲明 接口說明
iterator begin() 返回deque的起始位置
iterator end() 返回deque最後一個元素的下一位置
reverse_iterator rbegin() 返回deque其實位置的反向迭代器(end)
reverse_iterator rend() 返回deque最後一個元素的下一位置(begin)
const_iterator cbegin() const 返回deque起始位置的const 迭代器
cnost_iterator cend() const

返回deque最後一個元素的下一位置const

const_reverse_iterator crbegin() const 返回deque起始位置(crend)
const_reverse_iterator crend() const 返回deque最後一個元素下個位置(crbegin)
void DequeIteratorTest() {
	int array[] = { 1,2,3,4,5,6,7,8,9 };
	deque<int> d(array, array + sizeof(array) / sizeof(int));
	
	for (auto it = d.cbegin(); it != d.cend(); ++it) 
		cout << *it << " ";
	cout << endl;

	for (auto it = d.crbegin(); it != d.crend(); ++it)
		cout << *it << " ";
	cout << endl;


}

3、deque capacity

函數聲明 接口說明
size_type size() cosnt 返回deque中有效元素個數
bool empty() const 檢測deque是否爲空
void resize(size_type sz,T c = T()) 將deque的元素改變到sz個,多餘部分填c

 

4、deque的元素訪問操作

函數聲明

接口說明

reference operator[](size_type n) 返回n位置上元素的引用
const_reference operator[](size_type n)const

返回n位置上元素的cosnt 引用

reference front()

返回首元素的引用

const_reference front() cosnt 返回首元素的const 引用
reference back() 返回最後一個元素的引用

const_reference back() cosnt

返回最後一個元素的cosnt 引用

5、deque中修改操作

函數聲明

接口說明

void push_back(const value_type* val) 尾插
void pop_back() 尾刪
void push_front(const valuse_type* val) 頭插
void pop_front() 頭刪
iterator insert(iterator position,const value_type& val)

在pos插入val

void insert(iterator position,size_type n,const value_type& val)

在pos插入n個val

void insert(iterator position,Inputlterator frist,Inputlterator last) 在pos插入[frist,last)
iterator erase(iterator position) 刪除pos,並返回下一個位置
iterator erase(iterator first,iterator last) 刪除[frist,last),並返回last的位置
void swap(deque& x)

交換

void clear()

清空

iterator empalce(const_iterator position,Args.. args)

在pos處構造元素,將元素所需要內容通過參數類表傳入

void empalce_front(Args.. args)

在頭部構造元素
void empalce_backe(Args.. args) 在尾部構造元素
void Test() {
	deque<int> d1{ 3,4,5 };

	d1.push_back(6);
	d1.push_front(2);
	PrintDeque(d1);
	cout << d1.size() << endl;
	cout << d1.front() << endl;
	cout << d1.back() << endl;

	d1.emplace_back(7);
	d1.emplace_front(1);
	PrintDeque(d1);

	d1.insert(d1.begin(), 0);
	PrintDeque(d1);

	d1.pop_front();
	d1.pop_back();
	d1.erase(d1.begin());
	PrintDeque(d1);

	d1.clear();
	PrintDeque(d1);
}

三、deque的應用場景

deque在序列容器中是比較雞肋的,應用如果只是簡單的存儲元素,使用vector即可,如果對元素任意位置進入插入或者刪除操作比較多,使用vector即可,所以一般很少使用deque 。但是deque 的最大應用就是對 stack 和 queue 的底層結構;

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