1. 程式人生 > >【C++ STL】Deques

【C++ STL】Deques

容器 ever pty ngs 速度 pos algo dom 器)

1、結構

  容器deque和vector非常相似,也是采用動態數組來管理元素,提供隨機存取,有著和vector幾乎一樣的接口,不同的是deque的動態數組頭尾都開放,因此可以在頭尾都可以進行快速的安插和刪除。

技術分享

  為了獲取這種能力,deque通常實作為一組獨立區塊,第一區塊朝某方向擴展,最後一區塊朝另一方向擴展。

技術分享

2、deque能力

2.1 與vector區別

  兩端都能快速安插和刪除元素。

  存取元素時,deque內部結構會多一個間接的過程,所以存取和叠代器的動作會稍微慢一些。

  叠代器需要在不同的內存區塊跳轉,所以必須是特殊的智能型指針,非一般指針。

  deque不支持對容量和內存重分配時機的控制,除了頭尾兩端,在任何地方刪除或者增加元素都會使reference、pointers、iterators失效。deque的內存分配優於vector,由其內部可知,deque不必在內存重新分配時復制所有元素。

  deque的內存區塊不再被使用時,會被釋放。deque的內存大小是可縮減的。

2.2 與vector的共同點

  在中段部分安插、移除元素的速度相對較慢,因為所有的元素都需要移動或者騰出填補空間。

  叠代器屬於random access iterator(隨機存取叠代器)。

2.3 適用場景

  需要在兩段安插或者刪除元素

  無需引用容器內的元素

  要求釋放不再使用的元素。

3、操作函數

3.1 構造函數和析構函數

操作

效果

deque<Elem> c

產生一個空的deque

deque<Elem> c1(c2)

針對某個同型deque產生一個副本(所有元素都被拷貝)

deque<Elem> c(n)

產生一個包含n個元素的deque,這些元素均以default構造函數產生。

deque<Elem> c(n,elem)

產生一個包含n個元素的deque,這些元素均是elem的副本

deque<Elem> c(beg,end)

產生一個deque,以區間[beg,end)內的元素作為初值

c.~deque<Elem>()

銷毀所有元素,釋放內存

3.2 非變動操作

操作

效果

c.size()

返回當前的元素數量

c.empty()

判斷大小是否為零,等同於0 == size(),效率更高

c.max_size()

返回能容納的元素最大數量

c1 == c2

判斷c1是否等於c2

c1 != c2

判斷c1是否不等於c2(等同於!(c1==c2))

c1 < c2

判斷c1是否小於c2

c1 > c2

判斷c1是否大於c2

c1 <= c2

判斷c1是否小於等於c2(等同於!(c2<c1))

c1 >= c2

判斷c1是否大於等於c2 (等同於!(c1<c2))

c.at(idx)

返回索引idx所標示的元素,如果idx越界,拋出out_of_range

c[idx]

返回索引idx所標示的元素,不進行範圍檢查

c.front()

返回第一個元素,不檢查第一個元素是否存在

c.back()

返回最後一個元素,不檢查最後一個元素是否存在

c.begin()

返回一個隨機存取叠代器,指向第一個元素

c.end()

返回一個隨機存取叠代器,指向最後一個元素的下一個位置

c.rbegin()

返回一個逆向叠代器,指向逆向叠代的第一個元素

c.rend()

返回一個逆向叠代器,指向逆向叠代的最後一個元素的下一個位置

3.3變動性操作

操作

效果

c1 = c2

將c2所有的元素賦值給c1

c.assign(n,elem)

將n個elem元素的副本賦值給c

c.assign(beg,end)

將區間[beg,end)所有的元素賦值給c

c1.swap(c2)

c1和c2的元素互換

swap(c1,c2)

c1和c2的元素互換,全局函數

c.insert(pos,elem)

在pos位置安插一個elem副本,返回新元素的位置

c.insert(pos,n,elem)

在pos位置安插n個elem副本,無返回值

c.insert(pos,beg,end)

在pos位置安插區間[beg,end)所有元素的副本,無返回值

c.push_back(elem)

在尾部添加一個elem副本

c.pop_back()

移除最後一個元素

c.push_front(elem)

在頭部添加一個elem元素副本

c.pop_front()

移除頭部元素

c.erase(pos)

移除pos位置上的元素,返回下一個元素的位置

c.erase(beg,end)

移除區間[beg,end)所有的元素,返回下一個元素的位置

c. resize(num)

將大小(元素個數)重置為num個,如果size()增大,新增元素都已default構造函數構造出來

c.resize(num, elem)

將大小(元素個數)重置為num個,如果size()增大,新增元素都是elem的副本

c.clear()

移除所有元素,容器清空

3.4 註意

  deque不提供容量操作(capacity(),reserve())

  deque提供之間函數,完成頭部的刪除(pop_front())和插入(push_front ())操作。

   除了at(),沒有任何成員函數會檢查索引或者叠代器是否有效。

  元素的插入和刪除可能導致內存的重新分配,所以任何插入和刪除的動作都可能使所有指向deque元素的pointers、reference、iterators失效。唯一例外的是在頭部或尾部插入元素,pointers和reference依然有效,但是iterators會失效。

4、示例代碼

// cont/deque1. cpp

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

   int main()
   {

       //create empty deque of strings
       deque<string> coll;

       //insert several elements
       coll.assign (3, string("string"));
       coll.push_back ("last string");
       coll.push_front ("first string");

       //print elements separated by newlines
       copy (coll.begin(), coll.end(),
             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 (int 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.begin(), coll.end(),
             ostream_iterator<string>(cout,"\n"));

   }

輸出:

   first string
   string
   string
   string
   last string

   string
   another string
   another string
   resized string

【C++ STL】Deques