【STL記錄】Containers--Deques

Deque和vector很像,區別是deque能夠在兩頭插入和刪除。ios

要使用deque,需加上頭文件:函數

#include <deque>

1、Abilities of Deque

1.deque與vector的不一樣之處

  • 在頭尾插入和移除元素都很快
  • 訪問元素的內部結構更加間接,所以訪問和移動稍慢
  • Iterator必需是smart pointer而不是ordinary pointer,由於要在不一樣blocks之間跳
  • deque能包含更多的元素,因此max_size()更大一些
  • Deques不提供控制capacity和再分配的支持
  • 當不在使用時,內存空間將釋放

 因此,當知足一下條件時,使用deque:spa

  • 在兩端插入和移除元素
  • 不指向Container的元素
  • 重要的一點是當再也不使用時container會釋放內存(並不能保證必定會發生)

 2.Constructors and Destructor

Operation Effect
 deque<Elem> c Default constructor:建立一個空的deque
 deque<Elem> c(c2) Copy constructor:經過複製c2建立c
 deque<Elem> c = c2 Copy constructor:經過複製c2建立c
 deque<Elem> c(rv) Move constructor:creates a new deque,taking the contents of the rvalue rv
 deque<Elem> c = rv Move constructor:creates a new deque,taking the contents of the rvalue rv
 deque<Elem> c(n) 使用默認構造函數建立一個有n個元素的deque
 deque<Elem> c(n, elem) 建立一個有n個元素的deque,而且使用elem初始化
 deque<Elem> c(beg, end) 建立一個使用範圍[beg,end)初始化的deque
 deque<Elem> c(initList) 建立一個使用initList初始化的deque
 deque<Elem> c = initList 建立一個使用initList初始化的deque
 c.~deque() 銷燬全部元素並釋放內存

 

2、Vector Operations

1.Nonmodifying Operations

Operation Effect
 c.empty() 返回容器是否爲空(至關於size() == 0)
 c.size() 返回當前元素的個數
 c.max_size() 返回可能存在元素的最大個數
 c.shrink_to_fit() 收縮capacity,適應元素個數
 c1 == c2 返回c1是否等於c2
 c1 != c2 返回c1是否不等於c2
 c1 < c2 返回c1是否小於c2
 c1 > c2 返回c1是否大於c2
 c1 <= c2 返回c1是否小於等於c2
 c1 >= c2 返回c1是否大於等於c2
 c[idx] 返回索引爲idx的元素(無邊界檢查)
 c.at[idx] 返回索引爲idx的元素(有邊界檢查,拋出異常)
 c.front() 返回第一個元素(不檢查元素是否存在)
 c.back() 返回最後一個元素(不檢查元素是否存在)

 2.Modifying Operations

Operation Effect
 c.push_back(elem) 將elem附加到末尾
 c.pop_back() 移除最後一個元素,不返回
 c.push_front(elem) 將elem附加到開頭
 c.pop_front() 移除第一個元素,不返回
 c.insert(pos, elem) 將elem插入到pos以前的位置,並返回新元素的位置
 c.insert(pos, n, elem) 在pos以前的位置開始插入n個elem,並返回新插入的第一個元素的位置
 c.insert(pos, beg, end) 將[beg, end)的值插入到從pos以前的位置,並返回第一個新元素的位置
 c.insert(pos, initlist) 將initlist的值插入到從pos以前的位置,並返回第一個新元素的位置
 c.emplace(pos, args...) 將args插入到pos以前的位置,並返回第一個新元素的位置
 c.emplace_back(args...) 將args附加到末尾
 c.emplace_front(args...) 將args附加到開頭
 c.erase(pos) 移除pos所指的元素,並返回下一個元素位置
 c.erase(beg, end) 移除範圍[beg,end)的元素,並返回下一個元素的位置
 c.resize(num) 設置元素個數爲num,若是增加了,使用默認構造函數初始化
 c.resize(num, elem) 設置元素個數爲num,若是增加了,使用elem初始化
 c.clear() 移除全部元素

 3、Example of Using Deques

#include<iostream>
#include<deque>
#include<string>
#include<algorithm>
#include<iterator>
using namespace std;

int main()
{
	//create empty deque of string
	deque<string> coll;
	
	//insert several elements
	coll.assign( 3, "string");
	coll.push_back("last string");
	coll.push_front("first string");
	
	//print elements separated by newlines
	copy(coll.cbegin(), coll.cend(),
	     ostream_iterator<string>(cout, "\n"));
	cout << endl;
	
	//remove first and last element
	coll.pop_front();
	coll.pop_back();
	
	//insert "another" into every element but the first
	for(unsigned i = 1; i < coll.size(); ++i) {
		coll[i] = "another " + coll[i];
	}
	
	//change size to four elements
	coll.resize( 4, "resized string");
	
	//print elements separated by  newlines
	copy( coll.cbegin(), coll.cend(),
	      ostream_iterator<string>(cout, "\n"));
	
}

輸出:code

相關文章
相關標籤/搜索