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

C++ primer超詳細(xì)講解順序容器

 更新時(shí)間:2022年07月01日 10:03:57   作者:撲街男孩  
本文主要介紹了C++順序容器(vector、deque、list)的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

定義:一個(gè)容器就是一個(gè)特定類(lèi)型對(duì)象的集合。

順序容器概述

(1)順序容器類(lèi)型

vector:可變數(shù)組大小,支持快速訪問(wèn)

deque:雙端隊(duì)列,支持快速隨機(jī)訪問(wèn),在頭尾位置插入/刪除速度很快

forward_list:?jiǎn)蜗蜴湵?,只支持單向順序訪問(wèn)。

array:固定大小數(shù)組,不能添加或刪除元素

string:和vector類(lèi)似,用來(lái)保存字符

容器庫(kù)概覽

迭代器

迭代器范圍由一對(duì)迭代器表示,,通常被稱(chēng)為begin和end,而end從來(lái)都不會(huì)指向范圍中的最后一個(gè)元素,而是指向尾元素之后的位置,其元素范圍由數(shù)學(xué)表示為:

[begin,end)

容器定義和初始化

(1)將一個(gè)容器初始化為另一個(gè)容器的拷貝

可拷貝整個(gè)容器,也可以拷貝一個(gè)指定容器的元素范圍

新容器和原容器的元素類(lèi)型可以不同,只要能將要拷貝的元素轉(zhuǎn)換為要初始化的元素的類(lèi)型即可

list<string> authors={"nuktib","sha"m"aus"}
vector<const char *> articles={"a","an","the"}
list<string> list2(authors);      //正確,類(lèi)型匹配
deque<string> authList(authors)   //錯(cuò)誤,容器類(lèi)型不匹配
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í),除了指定元素類(lèi)型,還要指定容器大小

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è)不同但相容的類(lèi)型賦值,或者從一個(gè)容器的子序列賦值。

例:

list<string> name;
vector<const char*>old;
name.assign(old.cbegin(),old.cend())

上述代碼將name中的元素替換為迭代器指定范圍中的元素的拷貝,assign的參數(shù)決定了容器中將有多少個(gè)元素以及他們的值是什么

(2)使用swap

swap操作交換兩個(gè)相同類(lèi)型容器的內(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ú)此限制,因此可以將元素插入到容器開(kāi)始的位置,不必?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并重新開(kāi)始循環(huán),讀取下一個(gè)單詞,不斷循環(huán)。

訪問(wèn)元素

所有順序容器都存在一個(gè)front成員函數(shù),,除了forward_list之外的所有順序容器都由一個(gè)back成員函數(shù),front成員函數(shù)返回首元素的引用,back成員函數(shù)返回尾元素的引用

可以通過(guò)該引用修改容器中元素的值

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>

通過(guò)resize函數(shù)可以改變?nèi)萜鞯拇笮?,但array不支持此操作

c.resize(n):調(diào)整c為n個(gè)元素

c.resize(n,t):調(diào)整c為n個(gè)元素,任何新添加的元素都初始化為t

vector對(duì)象是如何增長(zhǎng)的

為了支持隨機(jī)訪問(wèn),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語(yǔ)言生成圖片的base64編碼的代碼實(shí)現(xiàn)

    使用C語(yǔ)言生成圖片的base64編碼的代碼實(shí)現(xiàn)

    Base64編碼是一種廣泛使用的編碼方案,將任意二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為可打印的ASCII字符字符串,在實(shí)際應(yīng)用中,Base64編碼常見(jiàn)于電子郵件附件、數(shù)據(jù)庫(kù)中存儲(chǔ)非文本數(shù)據(jù)等多種場(chǎng)景,本文將給大家介紹使用C語(yǔ)言生成圖片的base64編碼的代碼實(shí)現(xiàn),需要的朋友可以參考下
    2024-08-08
  • C++ 數(shù)據(jù)結(jié)構(gòu)之kmp算法中的求Next()函數(shù)的算法

    C++ 數(shù)據(jù)結(jié)構(gòu)之kmp算法中的求Next()函數(shù)的算法

    這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)之kmp算法中的求Next()函數(shù)的算法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • NSString與C字符串之間的相互轉(zhuǎn)換

    NSString與C字符串之間的相互轉(zhuǎn)換

    本文將詳細(xì)介紹NSString與C字符串之間的相互轉(zhuǎn)換,需要的朋友可以參考下
    2012-11-11
  • 詳細(xì)分析C++ 信號(hào)處理

    詳細(xì)分析C++ 信號(hào)處理

    這篇文章主要介紹了C++ 信號(hào)處理的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • C++中的字符串編碼處理方法

    C++中的字符串編碼處理方法

    這篇文章主要介紹了C++中的字符串編碼處理,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • C++圖論之Bellman-Ford算法和SPFA算法的實(shí)現(xiàn)

    C++圖論之Bellman-Ford算法和SPFA算法的實(shí)現(xiàn)

    貝爾曼-福特算法(Bellman-Ford)是由理查德·貝爾曼和萊斯特·福特創(chuàng)立的,求解單源最短路徑問(wèn)題的一種算法。SPFA 算法是 Bellman-Ford算法 的隊(duì)列優(yōu)化算法的別稱(chēng),通常用于求含負(fù)權(quán)邊的單源最短路徑。本文將詳解兩個(gè)算法的實(shí)現(xiàn),需要的可以參考一下
    2022-06-06
  • C++List容器常用函數(shù)接口刨析

    C++List容器常用函數(shù)接口刨析

    最近我學(xué)習(xí)了C++中的STL庫(kù)中的list容器,對(duì)于常用容器,我們不僅要會(huì)使用其常用的函數(shù)接口,我們還有明白這些接口在其底層是如何實(shí)現(xiàn)的。所以特意整理出來(lái)一篇博客供我們學(xué)習(xí)
    2022-08-08
  • 解決不用sizeof求出int大小的方法

    解決不用sizeof求出int大小的方法

    本篇文章是對(duì)不用sizeof求出int大小的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用集合(HashSet)

    C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用集合(HashSet)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)通用數(shù)據(jù)結(jié)構(gòu)之通用集合,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)代碼雨效果

    C語(yǔ)言實(shí)現(xiàn)代碼雨效果

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)代碼雨效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05

最新評(píng)論

长宁县| 崇仁县| 探索| 定南县| 花莲县| 平利县| 鄢陵县| 长武县| 民和| 新化县| 军事| 太谷县| 潮安县| 木里| 常山县| 德昌县| 马山县| 利津县| 开封县| 金沙县| 鹰潭市| 友谊县| 太仓市| 桐城市| 启东市| 阿巴嘎旗| 南靖县| 马鞍山市| 鄂伦春自治旗| 天全县| 长治市| 莱芜市| 岢岚县| 丰都县| 敖汉旗| 江门市| 盱眙县| 邵阳市| 江城| 台东市| 灵丘县|