1. 程式人生 > >STL之deque詳解

STL之deque詳解

Deuqe概念

        容器deque和vector非常相似,屬於序列式容器。都是採用動態陣列來管理元素,提供隨機存取,並且有著和vector一樣的介面。不同的是deque具有首尾兩端進行快速插入、刪除的能力

Deque結構

        如圖1是deque的邏輯結構,從表面上看,deque具有連續性的儲存空間,並支援隨機存取功能。實際上deque並不是我們所看到的樣子,其內部結構,如圖2所示。 deque在實現上主要有以下兩點:
1.由一段一段的定量連續空間構成,第一個區塊朝某個方向擴充套件,最後一個區塊朝相反方向擴充套件; 2.管理這些分段的定量連續空間,維護其整體連續的假象,並提供隨機存取的介面;
                                                                    圖 1 deque的邏輯結構              
                                                  圖 2  deque的內部結構

Deque的能力

與vector相比,deque功能上的不同之處在於
  • 首尾兩端都能快速的安插、刪除元素,因此需要在兩端安插、刪除元素時,最好採用deque。
  •  存在元素時,deque的內部結構會多一個間接過程,操作元素的效率會比vector低一些
  • 迭代器需要在不同區塊間跳轉,所以必須是特殊的智慧指標,非一般指標。
  • deque不支援對容量和記憶體重分配時機的控制,除了首尾兩端安插、刪除元素外,其他地方安插、刪除元素都將導致元素的pointer、reference、iterator失效。不過,deque的記憶體重分配機制優於vector,因為deque不必在記憶體重分配時複製所有的元素。
  • deque的記憶體區塊不再被使用時,會被釋放。
deque的操作函式
          Deque的操作函式和vector操作函式基本一模一樣,操作函式列表見STL之vector函式詳解 duque的各項操作只有以下幾點和vector不同:
  1. deque不提供容量操作( capacity()、reserve() )
  2. deque提供push_front()、pop_front()函式直接操作頭部
Deque的特點:
從deque的內部結構可知,deque元素是分佈在一段段連續空間上,因此deque具有如下特點:
1、支援隨機訪問,即支援[]以及at(),但是效能沒有vector好。
2、可以在內部進行插入和刪除操作,但效能不及list。
由於deque在效能上並不是最高效的,有時候對deque元素進行排序,更高效的做法是,將deque的元素移到到vector再進行排序,然後在移到回來

舉例

       我們操作deque時,不需要關心其內部結構的實現,我們按照deque的邏輯結構進行操作,可以認為deque是動態的一維陣列,可在首尾進行插入、刪除操作,下標從0開始。
#include "stdafx.h"
#include <deque>
#include <string>
#include <iostream>
#include <algorithm>

using namespace std;

void DequeExample()
{
	deque<string> strDeq;//空佇列
	strDeq.assign(3, string("string"));//賦值

	//列印deque的內容
	for (unsigned i = 0; i < strDeq.size(); i++)
	{
		cout << "strDeq[" << i << "] :"  << strDeq[i] << endl;
	}
	
	cout << "push_front and push_back elem to deque" << endl;
	
	//首尾插入元素
	strDeq.push_front("first string");
	strDeq.push_back("last string");

	//列印deque的內容
	for (unsigned i = 0; i < strDeq.size(); i++)
	{
		cout << "strDeq[" << i << "] :" << strDeq[i] << endl;
	}

	cout << "pop_front and pop_back elem from deque" << endl;
	
	//首尾彈出元素
	strDeq.pop_front();
	strDeq.pop_back();

	//列印deque的內容
	for (unsigned i = 0; i < strDeq.size(); i++)
	{
		cout << "strDeq[" << i << "] :"  << strDeq[i] << endl;
	}
}

執行結果

          
參考文章:        1.http://blog.csdn.net/xiajun07061225/article/details/7442816
       2.http://blog.csdn.net/hackbuteer1/article/details/7729451