C++ primer超詳細(xì)講解順序容器
定義:一個(gè)容器就是一個(gè)特定類型對(duì)象的集合。
順序容器概述
(1)順序容器類型
vector:可變數(shù)組大小,支持快速訪問
deque:雙端隊(duì)列,支持快速隨機(jī)訪問,在頭尾位置插入/刪除速度很快
forward_list:?jiǎn)蜗蜴湵恚恢С謫蜗蝽樞蛟L問。
array:固定大小數(shù)組,不能添加或刪除元素
string:和vector類似,用來保存字符
容器庫(kù)概覽
迭代器
迭代器范圍由一對(duì)迭代器表示,,通常被稱為begin和end,而end從來都不會(huì)指向范圍中的最后一個(gè)元素,而是指向尾元素之后的位置,其元素范圍由數(shù)學(xué)表示為:
[begin,end)
容器定義和初始化
(1)將一個(gè)容器初始化為另一個(gè)容器的拷貝
可拷貝整個(gè)容器,也可以拷貝一個(gè)指定容器的元素范圍
新容器和原容器的元素類型可以不同,只要能將要拷貝的元素轉(zhuǎn)換為要初始化的元素的類型即可
list<string> authors={"nuktib","sha"m"aus"} vector<const char *> articles={"a","an","the"} list<string> list2(authors); //正確,類型匹配 deque<string> authList(authors) //錯(cuò)誤,容器類型不匹配 forward_list<string> words(articles.begin(),articles.end()) //上述正確,可以將const char*元素轉(zhuǎn)換為string
(2)與順序容器大小相關(guān)的構(gòu)造函數(shù)
其中一個(gè)構(gòu)造函數(shù)接收一個(gè)容器大小和一個(gè)元素初始值
list<string> i(10,"hi") //10個(gè)strings元素,每個(gè)都初始化為"hi" vector<int> v(10,-1) //10個(gè)int元素,每個(gè)都初始化為-1 deque<string> i(10) //10個(gè)元素,每個(gè)都是空的string
(3)標(biāo)準(zhǔn)庫(kù)array具有固定大小
定義一個(gè)array時(shí),除了指定元素類型,還要指定容器大小
array<int,42> array<string,10>
內(nèi)置數(shù)組不支持拷貝或?qū)ο筚x值操作,但array無(wú)此限制
int digs[10]={1,2,3} int cpy[10]=digs //錯(cuò)誤,內(nèi)置數(shù)組不支持拷貝和賦值 array<int,10> d={1,2,3,4,5,6,7} array<int,10> c=d //正確
賦值和swap
(1) assign賦值函數(shù)(僅順序容器)
順序容器定義了一個(gè)名為assign的成員,允許我們從一個(gè)不同但相容的類型賦值,或者從一個(gè)容器的子序列賦值。
例:
list<string> name; vector<const char*>old; name.assign(old.cbegin(),old.cend())
上述代碼將name中的元素替換為迭代器指定范圍中的元素的拷貝,assign的參數(shù)決定了容器中將有多少個(gè)元素以及他們的值是什么
(2)使用swap
swap操作交換兩個(gè)相同類型容器的內(nèi)容
vector<string> v1(10); vector<string> v2(20); 上述交換結(jié)束后,v1將會(huì)擁有20個(gè)元素,v2將會(huì)擁有10個(gè)元素
順序容器操作
向順序容器添加元素
(1)使用push_back
除了array和forward_list之外,每個(gè)順序容器都支持push_back
(2)push_front
list,forward_list,deque容器還支持push_front將元素插入容器頭部
list<int> l; for(int i=0;i!=4;i++) l.push_front(i)
(3)在特定位置添加元素
insert函數(shù)可在特定位置添加元素,每個(gè)insert元素都接受一個(gè)迭代器作為其第一個(gè)參數(shù),insert函數(shù)將元素插入到迭代器所指得位置之前
雖然有些容器不支持push_front操作,但他們對(duì)于insert操作無(wú)此限制,因此可以將元素插入到容器開始的位置,不必?fù)?dān)心容器是否支持push_front
insert另一個(gè)版本還接受一個(gè)元素?cái)?shù)目和一個(gè)值,將指定數(shù)目的元素添加到指定位置之前。
s.insert(s.end(),10,"anna") //將10個(gè)元素插入到s的末尾
還可以接受一對(duì)迭代器或一個(gè)初始化列表插入
s.insert(s.end(),{"thses","as","sda","dasda"});
使用insert的返回值
list<string> l; auto iter = l.begin(); string word; while (cin >> word) iter = l.insert(iter, word);
上述代碼實(shí)現(xiàn)在一個(gè)特定位置反復(fù)插入元素
第一次調(diào)用insert將剛剛讀取的string插入到iter所指向的元素之前,insert返回的迭代器恰好指向這個(gè)新元素,我們將此迭代器賦予iter并重新開始循環(huán),讀取下一個(gè)單詞,不斷循環(huán)。
訪問元素
所有順序容器都存在一個(gè)front成員函數(shù),,除了forward_list之外的所有順序容器都由一個(gè)back成員函數(shù),front成員函數(shù)返回首元素的引用,back成員函數(shù)返回尾元素的引用
可以通過該引用修改容器中元素的值
if(!c.empty()) { c.front()=42; auto &v=c.back() v=1024; }
刪除元素
(1)pop_front和pop_back成員函數(shù)分別刪除首元素和尾元素,vector和string,forward_list不支持上述操作
(2)earse
成員函數(shù)erase從容器指定位置刪除元素,也可以刪除迭代器指定的單個(gè)元素,也可以刪除由一對(duì)迭代器指定的范圍內(nèi)的所有元素,上述最終均會(huì)返回指向刪除的元素之后位置的迭代器。
例:刪除所有的奇數(shù)
list<int> ls = { 0,1,2,3,4,5,6,7,8,9 }; auto it = ls.begin(); while (it != ls.end()) { if (*it % 2) it = ls.erase(it); else it++; }
接受一堆迭代器的erase版本允許我們刪除一個(gè)范圍內(nèi)的元素:
例: s.erase(s.begin(),s.end())
特殊的forwa_list單向鏈表操作
單向鏈表中由于特殊的插入和刪除,所以定義的函數(shù)也比較特殊
before_begin():返回指向鏈表首元素之前不存在的元素的迭代器,此迭代器不能解引用
insert_after(p,t):在迭代器p之后插入元素t
erase_after(p):刪除p所指位置之后的元素
例:刪除奇數(shù)元素:
forward_list<int> lst = { 0,1,2,3,4,5,6,7,8,9 }; auto pre = lst.before_begin(); auto cur = lst.begin(); while (cur != lst.end()) { if (*cur % 2) cur = lst.erase_after(pre); //將cur重置為erase_after的返回值,即指向cur的下一個(gè)元素 else { pre = cur; cur++; } }
改變?nèi)萜鞔笮?/h3>
通過resize函數(shù)可以改變?nèi)萜鞯拇笮。玜rray不支持此操作
c.resize(n):調(diào)整c為n個(gè)元素
c.resize(n,t):調(diào)整c為n個(gè)元素,任何新添加的元素都初始化為t
vector對(duì)象是如何增長(zhǎng)的
為了支持隨機(jī)訪問,vector將元素連續(xù)存儲(chǔ),當(dāng)不得不獲取新的內(nèi)存控件時(shí),vector和string通常會(huì)分配比新的控件需求更大的內(nèi)存控件,容器預(yù)留這些空間作為備用,可以保存更多元素。
capacity函數(shù)告訴我們?nèi)萜髟诓粩U(kuò)張內(nèi)存空間情況下可以容納多少元素
size():是指目前已經(jīng)保存的元素的數(shù)目
reverse(n):告訴容器至少分配容納n給元素的空間
到此這篇關(guān)于C++ primer超詳細(xì)講解順序容器的文章就介紹到這了,更多相關(guān)C++順序容器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++的QT項(xiàng)目打包成獨(dú)立可執(zhí)行和發(fā)布的exe文件(項(xiàng)目構(gòu)建過程)
這篇文章主要介紹了C++的QT項(xiàng)目打包成獨(dú)立可執(zhí)行和發(fā)布的exe文件(項(xiàng)目構(gòu)建過程),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11簡(jiǎn)述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制
這篇文章主要介紹了簡(jiǎn)述C++中虛擬函數(shù)的內(nèi)存分配機(jī)制,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-08-08Qt使用QJson模塊實(shí)現(xiàn)解析Json文件
在項(xiàng)目開發(fā)過程中,經(jīng)常會(huì)遇到讀寫Json文件的需求,掌握J(rèn)son文件的操作是基礎(chǔ)中的基礎(chǔ),下面我們就來看看如何使用QT內(nèi)置的QJson模塊解析Json文件吧2023-10-10C語(yǔ)言中g(shù)etchar(?)?函數(shù)使用詳解
getchar()?字符輸入函數(shù),沒有參數(shù),從輸入緩沖區(qū)里面讀取一個(gè)字,需要注意一次只能讀取一個(gè)字符,這篇文章主要介紹了C語(yǔ)言中g(shù)etchar函數(shù)使用詳解,需要的朋友可以參考下2022-12-12C語(yǔ)言實(shí)現(xiàn)24位彩色圖像二值化
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)24位彩色圖像二值化,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10c++ 讓程序開機(jī)自動(dòng)啟動(dòng)的方法
這篇文章主要介紹了c++ 讓程序開機(jī)自動(dòng)啟動(dòng)的方法,需要的朋友可以參考下2017-09-09C語(yǔ)言實(shí)現(xiàn)最長(zhǎng)遞增子序列問題的解決方法
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)最長(zhǎng)遞增子序列問題的解決方法,采用遞歸的方法解決該問題,是非常經(jīng)典的一類算法,需要的朋友可以參考下2014-09-09