国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++ STL第三篇(搞清楚deque原理和有多少用法)

這篇具有很好參考價值的文章主要介紹了C++ STL第三篇(搞清楚deque原理和有多少用法)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

deque

Vector容器是單向開口的連續(xù)內(nèi)存空間,deque則是一種雙向開口的連續(xù)線性空間。所謂的雙向開口,意思是可以在頭尾兩端分別做元素的插入和刪除操作,當然,vector容器也可以在頭尾兩端插入元素,但是在其頭部操作效率奇差,無法被接受。

C++ STL第三篇(搞清楚deque原理和有多少用法)

Deque容器和vector容器最大的差異,一在于deque允許使用常數(shù)項時間對頭端進行元素的插入和刪除操作。二在于deque沒有容量的概念,因為它是動態(tài)的以分段連續(xù)空間組合而成,隨時可以增加一段新的空間并鏈接起來,換句話說,像vector那樣,”舊空間不足而重新配置一塊更大空間,然后復制元素,再釋放舊空間”這樣的事情在deque身上是不會發(fā)生的。也因此,deque沒有必須要提供所謂的空間保留(reserve)功能.

雖然deque容器也提供了Random Access Iterator,但是它的迭代器并不是普通的指針,其復雜度和vector不是一個量級,這當然影響各個運算的層面。因此,除非有必要,我們應該盡可能的使用vector,而不是deque。對deque進行的排序操作,為了最高效率,可將deque先完整的復制到一個vector中,對vector容器進行排序,再復制回deque.

實現(xiàn)原理

Deque容器是連續(xù)的空間,至少邏輯上看來如此,連續(xù)現(xiàn)行空間總是令我們聯(lián)想到array和vector,array無法成長,vector雖可成長,卻只能向尾端成長,而且其成長其實是一個假象,事實上(1) 申請更大空間 (2)原數(shù)據(jù)復制新空間 (3)釋放原空間 三步驟,如果不是vector每次配置新的空間時都留有余裕,其成長假象所帶來的代價是非常昂貴的。

Deque是由一段一段的定量的連續(xù)空間構成。一旦有必要在deque前端或者尾端增加新的空間,便配置一段連續(xù)定量的空間,串接在deque的頭端或者尾端。Deque最大的工作就是維護這些分段連續(xù)的內(nèi)存空間的整體性的假象,并提供隨機存取的接口,避開了重新配置空間,復制,釋放的輪回,代價就是復雜的迭代器架構。

既然deque是分段連續(xù)內(nèi)存空間,那么就必須有中央控制,維持整體連續(xù)的假象,數(shù)據(jù)結構的設計及迭代器的前進后退操作頗為繁瑣。Deque代碼的實現(xiàn)遠比vector或list都多得多。

Deque采取一塊所謂的map(注意,不是STL的map容器)作為主控,這里所謂的map是一小塊連續(xù)的內(nèi)存空間,其中每一個元素(此處成為一個結點)都是一個指針,指向另一段連續(xù)性內(nèi)存空間,稱作緩沖區(qū)。緩沖區(qū)才是deque的存儲空間的主體。

C++ STL第三篇(搞清楚deque原理和有多少用法)

聲明方法

  1. 默認構造形式:使用默認構造函數(shù)創(chuàng)建一個空的deque容器。
deque<T> deqT;
deque<int> r1;//默認構造形式:創(chuàng)建一個空的deque容器
  1. 范圍構造函數(shù):使用指定范圍內(nèi)的元素創(chuàng)建deque容器,將[beg, end)區(qū)間中的元素拷貝給本身。
deque<T> deqT(beg, end);
int arr[] = { 1,2,3,4,5 };
deque<int> r2(arr, arr + 5);// 范圍構造函數(shù):將指定范圍內(nèi)的元素拷貝給本身

其中,beg是指向范圍起始位置的迭代器,end是指向范圍結束位置的迭代器。

  1. 值構造函數(shù):使用指定值創(chuàng)建deque容器,將n個elem拷貝給本身。
deque<T> deqT(n, elem);
deque<int> r3(3, 100);// 創(chuàng)建包含3個值為10的元素的deque

其中,n是要創(chuàng)建的元素數(shù)量,elem是要拷貝的元素值。

  1. 拷貝構造函數(shù):使用另一個deque容器進行拷貝構造,創(chuàng)建一個新的deque容器。
deque<T> deqT(deq);
deque<int> deq4(deq2);

其中,deq是要進行拷貝的deque容器。

賦值操作

  1. assign(beg, end);//將[beg, end)區(qū)間中的數(shù)據(jù)拷貝賦值給本身。

  2. assign(n, elem);//將n個elem拷貝賦值給本身。

  3. deque&operator=(const deque &deq); //重載等號操作符

  4. swap(deq);// 將deq與本身的元素互換

template <typename T>
void print(const T& r1, const T& r2){
	std::cout << "r1: ";
	for (const auto& elem : r1) {
		std::cout << elem << " ";
	}
	std::cout << std::endl;

	std::cout << "r2: ";
	for (const auto& elem : r2) {
		std::cout << elem << " ";
	}
	std::cout << std::endl;
	cout << "-------------" << endl;
}
deque<int> r1, r2;
deque<int> data = { 1,2,3,4,5 };
r1.assign(data.begin(), data.end());
print(r1, r2);
r2.assign(3, 100);
print(r1, r2);
r2 = r1;
print(r1, r2);
r1.swap(r2);
print(r1, r2);

C++ STL第三篇(搞清楚deque原理和有多少用法)

容量大小

deque.size();//返回容器中元素的個數(shù)

deque.empty();//判斷容器是否為空

deque.resize(num);//重新指定容器的長度為num,若容器變長,則以默認值填充新位置。如果容器變短,則末尾超出容器長度的元素被刪除。

deque.resize(num, elem); //重新指定容器的長度為num,若容器變長,則以elem值填充新位置,如果容器變短,則末尾超出容器長度的元素被刪除。

	deque<int> r1, r2;
	deque<int> data = { 1,2,3,4,5 };
	r1.assign(data.begin(), data.end());
	cout << "r2.empty:" << r2.empty() << endl;
	print(r1, r2);
	r2.assign(3, 100);
	print(r1, r2);
	cout << "r1 size: " << r1.size() << endl;
	r1.resize(8);
	r2.resize(8, 100);
	print(r1, r2);

C++ STL第三篇(搞清楚deque原理和有多少用法)

插入和刪除

push_back(elem);//在容器尾部添加一個數(shù)據(jù)

push_front(elem);//在容器頭部插入一個數(shù)據(jù)

pop_back();//刪除容器最后一個數(shù)據(jù)

pop_front();//刪除容器第一個數(shù)據(jù)

at(idx);//返回索引idx所指的數(shù)據(jù),如果idx越界,拋出out_of_range。

operator[];//返回索引idx所指的數(shù)據(jù),如果idx越界,不拋出異常,直接出錯。

front();//返回第一個數(shù)據(jù)。

back();//返回最后一個數(shù)據(jù)

insert(pos,elem);//在pos位置插入一個elem元素的拷貝,返回新數(shù)據(jù)的位置。

insert(pos,n,elem);//在pos位置插入n個elem數(shù)據(jù),無返回值。

insert(pos,beg,end);//在pos位置插入[beg,end)區(qū)間的數(shù)據(jù),無返回值。

clear();//移除容器的所有數(shù)據(jù)

erase(beg,end);//刪除[beg,end)區(qū)間的數(shù)據(jù),返回下一個數(shù)據(jù)的位置。

erase(pos);//刪除pos位置的數(shù)據(jù),返回下一個數(shù)據(jù)的位置。insert 函數(shù)的參數(shù) pos 實際上是一個迭代器(iterator)類型,而不是簡單的整數(shù)類型
deque<int> r1;
r1.push_back(27);
print(r1);
r1.push_front(12);
print(r1);
// 返回索引idx所指的數(shù)據(jù),如果idx越界,拋出out_of_range。
try {
	int v = r1.at(12);
	cout << "Value at index 12: " << v << std::endl;
	v = r1.at(127);
}
catch (const out_of_range& e) {
	cerr << "Out of range error: " << e.what() << std::endl;
}
// 返回索引idx所指的數(shù)據(jù),如果idx越界,不拋出異常,直接出錯。
int value = r1[1]; // 可能會直接出錯,因為不會拋出異常

cout << "First value: " << r1.front() << std::endl;// 返回第一個數(shù)據(jù)
cout << "Last value: " << r1.back() << std::endl;// 返回最后一個數(shù)據(jù)

//在pos位置插入一個elem元素的拷貝,返回新數(shù)據(jù)的位置。
auto it = r1.insert(r1.begin() + 2, 99);
/*在代碼中使用 auto 關鍵字的作用是讓編譯器根據(jù)等號右邊表達式的類型推導出左邊變量的類型,從而簡化代碼書寫。
r1.insert(r1.begin() + 2, 99) 這個表達式的返回類型是一個迭代器(iterator),它指向插入的元素位置。
由于迭代器的類型可能很復雜且并非顯式指定,因此可以使用 auto 讓編譯器自動推導出正確的類型。*/
// 在pos位置插入n個elem數(shù)據(jù)
r1.insert(r1.begin() + 2, 3, 88);
print(r1);
// 在pos位置插入[beg,end)區(qū)間的數(shù)據(jù)
deque<int> r2 = { 1,2,3 };
r1.insert(r1.begin() + 2, r2.begin(), r2.end());
r2 = r1;
print(r1);
r1.clear();
r1 = r2;
r1.erase(r1.begin() + 2, r1.begin() + 5);
print(r1);
r1.erase(r1.begin()+2);

C++ STL第三篇(搞清楚deque原理和有多少用法)文章來源地址http://www.zghlxwxcb.cn/news/detail-840740.html

到了這里,關于C++ STL第三篇(搞清楚deque原理和有多少用法)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 【C++】STL之適配器---用deque實現(xiàn)棧和隊列

    【C++】STL之適配器---用deque實現(xiàn)棧和隊列

    目錄 前言 一、deque ?1、deque 的原理介紹 ?2、deque 的底層結構 ?3、deque 的迭代器 ?4、deque 的優(yōu)缺點 ? 4.1、優(yōu)點 ? 4.2、缺點 二、stack 的介紹和使用 ?1、stack 的介紹 ?2、stack 的使用 ?3、stack 的模擬實現(xiàn) 三、queue 的介紹和使用 ?1、queue 的介紹? ?2、queue 的使用 ?3、queue 的模

    2024年02月07日
    瀏覽(23)
  • C++高級編程——STL:deque容器、stack容器和queue容器

    本專欄記錄C++學習過程包括C++基礎以及數(shù)據(jù)結構和算法,其中第一部分計劃時間一個月,主要跟著黑馬視頻教程,學習路線如下, 不定時更新,歡迎關注 。 當前章節(jié)處于: ---------第1階段-C++基礎入門 ---------第2階段實戰(zhàn)-通訊錄管理系統(tǒng), ---------第3階段-C++核心編程, -----

    2024年01月24日
    瀏覽(16)
  • 【C++】STL之容器適配器——使用deque適配stack和queue

    【C++】STL之容器適配器——使用deque適配stack和queue

    個人主頁:??在肯德基吃麻辣燙 分享一句喜歡的話:熱烈的火焰,冰封在最沉默的火山深處。 本文章主要介紹容器適配器的功能,以及一個適配的場景。 容器適配器,按字面意思理解的話,就是用來對一個容器進行匹配的。在C++STL中,容器有:vector,list,deque,map,set等。

    2024年02月16日
    瀏覽(26)
  • C++練級之初級:第三篇

    C++練級之初級:第三篇

    ??首先我們先解決一下為什么C++支持函數(shù)重載,而C語言不支持? 這里就不得不提起編譯鏈接了??; ??這是編譯鏈接篇 以這三個簡單的文件為例: 預處理階段: 頭文件的展開,條件編譯,宏的替換,注釋的刪除等,最終處理完這些后test.c就會變成test.i,add.c就會變成add.i;

    2023年04月23日
    瀏覽(20)
  • 【C++】STL中stack,queue容器適配器的模擬實現(xiàn)(使用deque容器)

    【C++】STL中stack,queue容器適配器的模擬實現(xiàn)(使用deque容器)

    ??博客主頁: 主頁 ??系列專欄: C++ ??感謝大家點贊??收藏?評論?? ??期待與大家一起進步! 雖然stack和queue中也可以存放元素,但在STL中并沒有將其劃分在容器的行列,而是將其稱為容器適配器,這是因為stack和隊列只是對其他容器的接口進行了包裝,STL中stack和

    2024年02月15日
    瀏覽(31)
  • C++知識第三篇之繼承

    C++知識第三篇之繼承

    繼承是 面向?qū)ο缶幊?的重要特征,是對類設計層次的復用 1.繼承定義 Parent :是父類,也稱作基類(base class); Student :是子類,也稱作派生類(derived class) public :表示繼承方式為公共繼承 2.繼承方式 子類繼承父類,有3種繼承方式 繼承方式的作用是: 對于父類非private的成員

    2024年02月06日
    瀏覽(22)
  • C++中deque的用法(超詳細,入門必看)

    C++中deque的用法(超詳細,入門必看)

    博主簡介: Hello大家好呀,我是陳童學,一個與你一樣正在慢慢前行的人。 博主主頁: @陳童學哦 所屬專欄: C++STL 如果本文對你有所幫助的話,希望可以點贊??收藏??支持一下哦! 期待你的關注,一起成長喲! 前言: Hello各位小伙伴們好!歡迎來到 本專欄C++STL 的學習,

    2024年02月07日
    瀏覽(20)
  • 第一百二十五天學習記錄:C++提高:STL-deque容器(下)(黑馬教學視頻)

    第一百二十五天學習記錄:C++提高:STL-deque容器(下)(黑馬教學視頻)

    功能描述: 向deque容器中插入和刪除數(shù)據(jù) 函數(shù)原型: 兩端插入操作: 指定位置操作: 這里有個坑需要避一下,就是當重復執(zhí)行d1.erase(it);后程序運行會崩潰。 崩潰的原因是在執(zhí)行d1.erase(it)之后,迭代器it失效了,不能再繼續(xù)使用。在C++的STL中,當執(zhí)行erase操作后,如果要繼續(xù)

    2024年02月13日
    瀏覽(23)
  • 第一百二十四天學習記錄:C++提高:STL-deque容器(上)(黑馬教學視頻)

    第一百二十四天學習記錄:C++提高:STL-deque容器(上)(黑馬教學視頻)

    功能: 雙端數(shù)組,可以對頭端進行插入刪除操作 deque與vector區(qū)別 vector對于頭部的插入刪除效率低,數(shù)據(jù)量越大,效率越低 deque相對而言,對頭部的插入刪除速度比vector快 vector訪問元素的速度會比deque快,這和兩者內(nèi)部實現(xiàn)有關 deque內(nèi)部工作原理: deque內(nèi)部有個中控器,維護

    2024年02月13日
    瀏覽(34)
  • 從零開始c++精講:第三篇——內(nèi)存管理

    從零開始c++精講:第三篇——內(nèi)存管理

    為什么要有內(nèi)存區(qū)域的劃分呢? 因為不同數(shù)據(jù)有不同的存儲需求,各區(qū)域滿足不同的需求。 棧(堆棧) :一般存放臨時用的,比如非靜態(tài)局部變量/函數(shù)參數(shù)/返回值等,棧是向下增長的。 堆 :有動態(tài)使用的需求,需要的時候你給我,不需要的時候你釋放。也就是出了函數(shù)作

    2024年01月21日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包