最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ deque與vector對比的優(yōu)缺點

 更新時間:2023年01月04日 10:03:05   作者:川入  
這篇文章主要介紹了C++中deque與vector相比的優(yōu)勢與劣勢,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧

deque容器

deque的相關(guān)文檔

deque與vector十分的相識。vector是單向開口的連續(xù)線性空間(單向擴容),deque則是一種雙向開口的連續(xù)線性空間(雙向擴容)。雙向開口:可以在頭尾兩端分別做元素的插入和刪除操作。區(qū)別就在此,vector當(dāng)然也可以在頭尾兩端進行操作,但是其頭部操作的效率奇差,無法被接受,如:stack與queue的容量適配器就在二者其中,選擇deque(當(dāng)然使用vector也可)。

vector與deque的差異:

  • deque允許于常數(shù)時間內(nèi)對頭端進行元素的插入或移除操作。
  • deque沒有所謂的容量觀念,因為它是動態(tài)地以分段連續(xù)空間組合而成,隨時可以增加一段新的空間并連接起來。

與stack相比deque的優(yōu)缺點:

優(yōu)勢:

  • 頭尾插入刪除很方便

劣勢:

  • operator[]計算稍顯復(fù)雜,大量使用,性能下降(下標(biāo)需要經(jīng)過計算)。
  • 中間插入刪除效率不高(下標(biāo)需要經(jīng)過計算,并且需要挪動元素)。
  • 底層角度迭代器會很復(fù)雜。

結(jié)論:

  • 頭尾的插入刪除deque非常適合,相比vector而言,很適合去做stack和queue的默認(rèn)適配容器。
  • 中間插入刪除少用deque,可以用:list(因為無需挪動元素)。
  • 隨機訪問多用vector(因為下標(biāo)是確定的)。

deque的迭代器

需要注意,deque是連續(xù)的空間,但是這只是其邏輯上的,物理上并不是。所以在迭代器上維持其“整體連續(xù)”假象的工作,就落在迭代器中的operator++與operator--上了。

首先,連續(xù)重要的就是能夠指出分段空間在哪里,其次,它必須能夠判斷自己是否已經(jīng)處于其所在的存儲邊緣,如果是,一旦前行或后退時就必須跳躍到下一個或上一個存儲空間。

// __deque_iterator的源碼
template <class T, class Ref, class Ptr, size_t BufSiz>
struct __deque_iterator
{
	typedef __deque_iterator<T, T&, T*>             iterator;
	typedef __deque_iterator<T, const T&, const T*> const_iterator;
	static size_t buffer_size() {return __deque_buf_size(0, sizeof(T)); }//buffer_size()用于確定緩沖區(qū)的大小
	typedef random_access_iterator_tag iterator_category;
	typedef T value_type;
	typedef Ptr pointer;
	typedef Ref reference;
	typedef size_t size_type; // size_t 是unsigned 類型,通常用來指明數(shù)組長度
	typedef ptrdiff_t difference_type; // ptrdiff_t 是 signed 整型,通常用來保存兩個指針減法操作的結(jié)果
	typedef T** map_pointer;
	typedef __deque_iterator self;
	// 保持與容器的聯(lián)結(jié),是對某一個緩沖區(qū)而言的
	T* cur;       // 此迭代器所指之緩沖區(qū)中的現(xiàn)行元素
	T* first;     // 此迭代器所指之緩沖區(qū)的頭
	T* last;      // 此迭代器所指之緩沖區(qū)的尾(含備用空間)
	map_pointer node;    // 指向管控中心
        ...
}
//deque_buf_size()全局函數(shù)
inline size_t deque_buf_size(size_t n, size_t sz){
    return n != 0 ? n : (sz < 512 ? size_t(512 / sz) : size_t(1));
}
//定義:
//1. 如果n不為0,傳回n,表示buffer size由使用者自定。
//2. 如果n為0,表示buffer size使用默認(rèn)值,那么:
//    如果sz不小于 512,返回1。
//    如果sz(元素大小,sizeof(value_type))小于512,傳回512/sz。

void set_node(map_pointer new_node) {
	node = new_node;
	first = *new_node;
	last = first + difference_type(buffer_size());
}
reference operator*() const { return *cur; }
pointer operator->() const { return &(operator*()); }
difference_type operator-(const self& x) const {
	return difference_type(buffer_size()) * (node - x.node - 1) + (cur - first) + (x.last - x.cur);
}
self& operator++() {
	++cur;        //切換至下個元素
	if (cur == last) {   //如果已達所在緩沖區(qū)的尾端,就切換至下一節(jié)點(亦即緩沖區(qū))的第一個元素
		set_node(node + 1);
		cur = first;
	}
	return *this;
}
self operator++(int) { //后置式,標(biāo)準(zhǔn)寫法
	self tmp = *this;
	++*this;
	return tmp;
}
self& operator--() {
	if (cur == first) {//如果已達所在緩沖區(qū)的頭端, 就切換至前一節(jié)點(亦即緩沖區(qū))的最后一個元素
		set_node(node - 1);
		cur = last;
	}
	--cur; //切換至前一個元素
	return *this;
}
self operator--(int) { //后置式,標(biāo)準(zhǔn)寫法
	self tmp = *this;
	--*this;
	return tmp;
}
// 以下實現(xiàn)隨機存取。迭代器可以直接跳躍n個距離
self& operator+=(difference_type n) {
	difference_type offset = n + (cur - first);
	if (offset >= 0 && offset < difference_type(buffer_size()))
		//標(biāo)的位置在同一緩沖區(qū)內(nèi)
		cur += n;
	else {
		//標(biāo)的位置不在同一緩沖區(qū)內(nèi)
		difference_type node_offset =
			offset > 0 ? offset / difference_type(buffer_size()) : -difference_type((-offset - 1) / buffer_size()) - 1;
		// 切換至正確的節(jié)點(亦即緩沖區(qū))
		set_node(node + node_offset);
		// 切換至正確的元素
		cur = first + (offset - node_offset * difference_type(buffer_size()));
	}
	return *this;
}
self operator+(difference_type n) const {
    self tmp = *this;
    return tmp += n; //調(diào)用operator+=
}
//利用operator+=完成operator-=
self& operator-=(difference_type n) { return *this += -n; }
self operator-(difference_type n) const {
    self tmp = *this;
    return tmp -= n; //調(diào)用operator-=
}
//實現(xiàn)隨機存取,迭代器可以直接跳躍n個距離
reference operator[] (difference_type n) const { return * (*this + n);)}
bool operator==(const self& x) const { return cur == x.cur; }
bool operator!=(const self& x) const { return !(*this == x); }
bool operator<(const self& x) const {
    return (node == x.node) ? (cur < x.cur) : (node < x.node);
}

deque的成員函數(shù)

函數(shù)成員函數(shù)功能
begin()返回指向容器中第一個元素的迭代器。
end()返回指向容器最后一個元素所在位置后一個位置的迭代器,通常和 begin() 結(jié)合使用。
rbegin()返回指向最后一個元素的迭代器。
rend()返回指向第一個元素所在位置前一個位置的迭代器。
cbegin()和 begin() 功能相同,只不過在其基礎(chǔ)上,增加了 const 屬性,不能用于修改元素。
cend()和 end() 功能相同,只不過在其基礎(chǔ)上,增加了 const 屬性,不能用于修改元素。
crbegin()和 rbegin() 功能相同,只不過在其基礎(chǔ)上,增加了 const 屬性,不能用于修改元素。
crend()和 rend() 功能相同,只不過在其基礎(chǔ)上,增加了 const 屬性,不能用于修改元素。
size()返回實際元素個數(shù)。
max_size()返回容器所能容納元素個數(shù)的最大值。這通常是一個很大的值,一般是 232-1,我們很少會用到這個函數(shù)。
resize()改變實際元素的個數(shù)。
empty()判斷容器中是否有元素,若無元素,則返回 true;反之,返回 false。
shrink _to_fit()將內(nèi)存減少到等于當(dāng)前元素實際所使用的大小。
at()使用經(jīng)過邊界檢查的索引訪問元素。
front()返回第一個元素的引用。
back()返回最后一個元素的引用。
assign()用新元素替換原有內(nèi)容。
push_back()在序列的尾部添加一個元素。
push_front()在序列的頭部添加一個元素。
pop_back()移除容器尾部的元素。
pop_front()移除容器頭部的元素。
insert()在指定的位置插入一個或多個元素。
erase()移除一個元素或一段元素。
clear()移出所有的元素,容器大小變?yōu)?0。
swap()交換兩個容器的所有元素。
emplace()在指定的位置直接生成一個元素。
emplace_front()在容器頭部生成一個元素。和 push_front() 的區(qū)別是,該函數(shù)直接在容器頭部構(gòu)造元素,省去了復(fù)制移動元素的過程。
emplace_back()在容器尾部生成一個元素。和 push_back() 的區(qū)別是,該函數(shù)直接在容器尾部構(gòu)造元素,省去了復(fù)制移動元素的過程。

到此這篇關(guān)于C++ deque與vector對比的優(yōu)缺點的文章就介紹到這了,更多相關(guān)C++ deque與vector內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++貪心算法處理多機調(diào)度問題詳解

    C++貪心算法處理多機調(diào)度問題詳解

    貪心算法(又稱貪婪算法)是指,在對問題求解時,總是做出在當(dāng)前看來是最好的選擇。也就是說,不從整體最優(yōu)上加以考慮,他所做出的僅是在某種意義上的局部最優(yōu)解
    2022-06-06
  • Linux下如何使用C++獲取硬件信息

    Linux下如何使用C++獲取硬件信息

    這篇文章主要為大家詳細介紹了如何使用C++實現(xiàn)獲取CPU,主板,磁盤,BIOS信息等硬件信息,文中的示例代碼講解詳細,感興趣的小伙伴可以了解下
    2025-04-04
  • C語言入門篇--sizeof與strlen基礎(chǔ)理論

    C語言入門篇--sizeof與strlen基礎(chǔ)理論

    本篇文章是c語言基礎(chǔ)篇,主要為大家介紹了C語言的sizeof與strlen的基本理論知識,希望可以幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • C++?QT?QThread啟動、停止、暫停和恢復(fù)的實現(xiàn)

    C++?QT?QThread啟動、停止、暫停和恢復(fù)的實現(xiàn)

    本文主要介紹了C++?QT?QThread啟動、停止、暫停和恢復(fù)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C/C++實現(xiàn)快速排序的方法

    C/C++實現(xiàn)快速排序的方法

    這篇文章主要介紹了C/C++實現(xiàn)快速排序的方法,這幾天在找工作,被問到快速排序,結(jié)果想不出來快速排序怎么弄的;回來搜索了一下,現(xiàn)在記錄下來,方便以后查看。
    2014-12-12
  • C語言簡明講解預(yù)編譯的使用

    C語言簡明講解預(yù)編譯的使用

    在C語言的程序中包括各種以符號#開頭的編譯指令,這些指令稱為預(yù)處理命令。預(yù)處理命令屬于C語言編譯器,而不是C語言的組成部分,通過預(yù)處理命令可擴展C語言程序設(shè)計的環(huán)境
    2022-05-05
  • C++的內(nèi)存管理詳細解釋

    C++的內(nèi)存管理詳細解釋

    這篇文章主要介紹了C/C++中的內(nèi)存管理小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-09-09
  • 詳解C++ 桶排序(BucketSort)

    詳解C++ 桶排序(BucketSort)

    這篇文章主要介紹了C++桶排序,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • vs運行時報C4996代碼錯誤的問題解決

    vs運行時報C4996代碼錯誤的問題解決

    C4996錯誤的意思:是VS覺得strcpy這函數(shù)不安全,建議你使更安全的函數(shù),那么如何解決呢,本文主要介紹了vs運行時報C4996代碼錯誤的問題解決,感興趣的可以了解一下
    2024-01-01
  • 詳解C++11中的線程鎖和條件變量

    詳解C++11中的線程鎖和條件變量

    C++ 11允許開發(fā)者們以標(biāo)準(zhǔn)的、不依賴于平臺的方式編寫多線程程序。這篇文章概述了標(biāo)準(zhǔn)庫對于線程和同步操作機制的支持。這些都是非常重要的知識,希望讀者們可以認(rèn)真看一下
    2021-06-06

最新評論

白玉县| 高州市| 曲麻莱县| 黄山市| 临汾市| 平谷区| 新津县| 扶风县| 鄢陵县| 本溪市| 天峨县| 金秀| 巢湖市| 西宁市| 霍林郭勒市| 本溪| 余庆县| 衡南县| 玛纳斯县| 兴隆县| 天津市| 资溪县| 绥棱县| 天柱县| 延边| 板桥市| 南陵县| 禹城市| 绵竹市| 边坝县| 清河县| 扎赉特旗| 萝北县| 广昌县| 孝义市| 玛曲县| 女性| 娱乐| 和顺县| 焉耆| 凤翔县|