一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - C++ STL 序列式容器與配接器的簡單使用

C++ STL 序列式容器與配接器的簡單使用

2021-11-19 15:43極客熊貓GeekPanda C/C++

本文主要介紹了C++ STL 序列式容器與配接器的簡單使用,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學習學習吧

容器概述

C++標準里提供了以下容器或容器配接器:

 

序列式容器 配接器 關聯式容器 不定序關聯容器
array stack set unordered_set
vector queue map unordered_map
list priority_queue multiset unordered_multiset
deque   multimap unordered_multimap
forward_list      

 

序列式容器

array

array是靜態連續空間,一經配置,大小不可改變。

就是數組,除了空間的靈活性不足,其他與vector很像。用的也比較少,一般都用vector了,這里就不多說了。

vector

vector的數據安排與操作方式,與array很相似。二者唯一的差別在于空間的運用的靈活性。

  • array是靜態空間,一旦配置不能改變;
  • vector是動態空間,隨著元素加入,內部機制會自行擴充空間以容納新元素。

vector維護的是連續線性空間,其指針就是普通指針。

?
1
vector<int>::iterator iter;

那么iter其實就是int*類型。

兩個迭代器start和finish之間是連續空間中目前已被使用的空間,end_of_storage指向整塊連續空間的尾端。

為了降低頻繁空間配置帶來的成本開銷,vector實際配置的大小會比客戶需求的更大一些,以備將來可能的擴充。這便是capacity的概念。

  • [start,finish]是size();
  • [start, end_of_storage]是capacity();
  • [finish, end_of_storage]是備用空間。

一旦size() == capacity(),便是滿載。下次再有新增元素,整個vector就要另覓他所了。“另覓他所”的過程會經歷“重新配置大空間,元素移動,釋放原空間”這一系列動作,工程浩大。

所謂動態增加大小,并不是在原空間之后接續新空間(因為無法保證原空間之后有可供配置的空間),而是以原空間大小的兩倍另外配置一塊較大空間,然后將原內容拷貝過來,然后才開始在原內容后邊構造新元素,并釋放原空間。

因此,對vector的任何操作,一旦引起空間重新配置,指向原vector的所有迭代器就都失效了,這是一個經常犯的錯誤,務必小心。

list

list是環狀雙向鏈表。它的好處在于每次插入或刪除一個元素,就配置或釋放一個元素空間,與vector相比,list對空間運用更加精準,絕不浪費。且對于任何位置的元素插入或移除,list永遠是常數時間。

vector和list適用場景與以下有關:

  • 元素多寡
  • 元素的構造復雜度(有無non-trival copy constructor, non-trival copy assignment operator)
  • 元素存取行為的特性

list的節點結構如下:

?
1
2
3
4
5
6
7
template <class T>
struct __list_node{
    typedef void* void_pointer;
    void_pointer prev;
    void_pointer next;
    T data;
};

由于list的內存空間無法保證是連續的,所以它的迭代器不再是普通指針。list的迭代器必須有能力指向list節點,并進行正確的遞增、遞減、取值、成員存取等操作。

list的操作大多不會使迭代器失效,即便是刪除操作,也只有指向被刪除元素的那個迭代器失效。

由于list是一個環狀雙向鏈表,所以它只需要一個指針,便可以完整遍歷整個鏈表。

對于insert操作,新節點將位于哨兵迭代器(標示出插入點)所指節點的前方,這是STL對插入操作的標準規范。

deque

vector是單向開口的連續線性空間,deque則是一種雙向開口的線性連續空間。所謂雙向開口,即可以在首尾兩端分別做元素的插入和刪除操作。

deque其實是動態地以分段連續空間組合而成。但是這些分段的連續空間,在用戶看來確實一整塊連續空間,這其實是deque做出的假象。這種假象由deque的中控器map(注意,不是STL中的map容器)負責維持。

這個map可以理解為映射,它是一個指針,指向一小段連續內存空間,這塊空間中的每個元素又都是一個指針,每個指針都指向deque的分段連續空間中的某一段。默認每一段是512字節。

forward_list

forward_list是單向鏈表。

前邊說了,對于insert操作,新節點將位于哨兵迭代器(標示出插入點)所指節點的前方,這是STL對插入操作的標準規范。

但是forward_list作為單向鏈表,它沒有什么方便方法回頭定出前一個位置,它只能從頭找起,所以除了forward_list起點處附近的區域外,在其他位置insert()或erase()就很慢,對此,forward_list特別提供了insert_after()和erase_after()。

同樣出于效率考慮,它不提供push_back(),只提供push_front()。

Adapter(配接器)

stack

stack是先進后出(FILO)的數據結構。他只有一個出口,除了最頂端元素外,沒有其他方法獲得stack的其他元素。即stack是不允許有遍歷行為的,自然也就沒有迭代器了。

STL中的stack其實不算是container,而是adapter,因為其底層默認是deque,把deque的頭端封閉,便形成一個stack。

具有“修改某物接口,形成另一種風貌”之性質者,謂之adapter。

除了deque,list也是雙向開口的,所以list也可以做stack的底層結構。

queue

queue是先進先出(FIFO)的數據結構。它有兩個出入口,但都是被限制的,尾端只進不出,頭端只出不進。除了尾端進,頭端出之外,沒有其他方法存取queue的其他元素,即queue也是不允許遍歷的,自然也就沒有迭代器了。

queue也是一種adapter,它同stack一樣,默認以deque作為底層結構,list同樣也可以做其底層結構。

把deque的頭端入口和尾端出口,就成了一個queue。

priority_queue

priority_queue是擁有權值觀念的queue。

所謂擁有權值觀念,可以理解為有序的,其內的元素并非按照加入的次序排列,而是按照元素的權值排列,權值最高者排在最前邊。

默認狀態下,priority_queue是用一個大根堆(max-heap)來完成,而大根堆是一個以vector表現得完全二叉樹。

大根堆:max-heap,父節點值大于或等于子節點值的完全二叉樹;
小根堆:min-heap,父節點值小于或等于子節點值的完全二叉樹。

所以,priority_queue是以vector為底層結構,輔以heap處理規則來實現的,所以它也是一種adapter。

priority_queue也不允許遍歷,自然也沒有迭代器。

到此這篇關于C++ STL 序列式容器與配接器的簡單使用的文章就介紹到這了,更多相關C++ STL 序列式容器與配接器內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/qq_29186859/article/details/118345549

延伸 · 閱讀

精彩推薦
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
主站蜘蛛池模板: 亚洲国产果果在线播放在线 | 干妞网免费视频 | 久久九九精品国产自在现线拍 | 欧美人交性视频在线香蕉 | 奇米影视888四色首页 | 色狼屋 | 99热资源| 精品久久伦理中文字幕 | 久久综合给会久久狠狠狠 | 99最新网址| 亚洲精品在线看 | 性做久久久久久 | 日产乱码卡1卡2卡三免费 | 久久婷婷五月综合色丁香 | 国产农村乱子伦精品视频 | 日本免费一区二区三区四区五六区 | 草莓丝瓜芭乐樱桃榴莲色多黄 | 极品美女写真菠萝蜜视频 | 国产91精品久久久久久 | boobsmilking流奶水| 亚洲 欧美 制服 校园 动漫 | 蛮荒的童话未删减在线观看 | 国产一区二区在线看 | ass巨大胖女人sias | 日日摸日日碰夜夜爽97纠 | 第一福利在线视频 | 亚洲色图第四色 | 秘书小说 | ak福利午夜在线观看 | www在线免费观看 | 国产成人精品综合在线观看 | 亚洲尿尿 | 国产成人精品1024在线 | 国产黄频在线观看 | 日本精品一二三区 | 美女1819xxxx | 亚洲精品第一国产综合 | 97se狠狠狠狠狼亚洲综合网 | 日韩精品一区二区 | 四虎成人www国产精品 | 日韩在线视频一区二区三区 |