成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

【C++】關(guān)聯(lián)式容器-map和set-創(chuàng)新互聯(lián)

文章目錄
  • 關(guān)聯(lián)式容器
  • 鍵值對(duì)
  • set
    • 基本介紹
    • set的模板參數(shù)列表
    • set的構(gòu)造
    • set的迭代器
    • set的修改操作
  • map
    • 基本介紹
    • map的模板參數(shù)說(shuō)明
    • map的構(gòu)造
    • map的迭代器
    • map的元素訪問(wèn)
    • map中元素的修改
    • map總結(jié)

創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),玉泉街道企業(yè)網(wǎng)站建設(shè),玉泉街道品牌網(wǎng)站建設(shè),網(wǎng)站定制,玉泉街道網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,玉泉街道網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。關(guān)聯(lián)式容器

STL中的容器分為兩大類:序列式容器和關(guān)聯(lián)式容器。
序列式容器有vector、list、deque、forward_list等,為什么他們被稱為序列式容器呢?因?yàn)樗麄兊牡讓訛榫€性序列的數(shù)據(jù)結(jié)構(gòu),里面存儲(chǔ)的是元素本身。關(guān)聯(lián)式容器也是用來(lái)存儲(chǔ)數(shù)據(jù)的,與序列式容器不同的是,其里面存儲(chǔ)的是結(jié)構(gòu)的鍵值對(duì),在數(shù)據(jù)檢索時(shí)比序列式容器的效率更高。

鍵值對(duì)

鍵值對(duì)用來(lái)表示具有一一對(duì)應(yīng)關(guān)系的一種結(jié)構(gòu),該結(jié)構(gòu)中一般只包含兩個(gè)成員變量key和value,key代表鍵值,value表示與key對(duì)應(yīng)的信息。

SGI-STL中關(guān)于鍵值對(duì)的定義:

struct pair
{typedef T1 first_type;
	
	typedef T2 second_type;
	T1 first;
	T2 second;
	pair():first(T1()),second(T2())//零初始化
	{}
	pair(const T1& a,const T2& b):first(a),first(b)
	{}
};

有下面這幾種方法來(lái)構(gòu)造鍵值對(duì):

int main()
{pairv;//v被定義為鍵值對(duì)類型,那就有了兩個(gè)成員變量
	v.first = 1;
	v.second = "hello";
	cout<< v.first<< " : "<< v.second<< endl;//1 : hello

	pairv1(2, "Linux");
	cout<< v1.first<< " : "<< v1.second<< endl;//2 : Linux

	v = v1;
	cout<< v.first<< " : "<< v.second<< endl;//2 : Linux

	pairv2 = make_pair(3, "C++");
	cout<< v2.first<< " : "<< v2.second<< endl;//3 : C++
	return 0;
}
set 基本介紹
  • set是按照一定次序存儲(chǔ)元素的容器。
  • 在set中,元素的value也標(biāo)識(shí)它,value就是key,類型為T,并且每個(gè)value必須是唯一的。set中的元素不能在容器中修改,但是可以在容器中進(jìn)行插入和刪除。
  • set容器通過(guò)key訪問(wèn)單個(gè)元素的速度通常比unordered_set容器慢,但是它們?cè)试S根據(jù)順序?qū)ψ蛹M(jìn)行直接迭代。
  • set在底層是用紅黑樹(shù)實(shí)現(xiàn)的。

注意:

  • 與map不同,map中存儲(chǔ)的是真正的鍵值對(duì),set中只放value,但是在底層實(shí)際存放是由構(gòu)成的鍵值對(duì)。
  • set中插入元素時(shí),只需要插入value即可,不需要構(gòu)造鍵值對(duì)。
  • set中的元素不可以重復(fù)
  • 使用set的迭代器遍歷set中的元素,可以得到有序序列
  • set中的元素默認(rèn)按照小于來(lái)比較
  • set中查找某個(gè)元素,時(shí)間復(fù)雜度為以2為底n的對(duì)數(shù)。
  • set中的元素不允許修改

驗(yàn)證set中的元素默認(rèn)按照小于進(jìn)行排序:

void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };

	setis(iv.begin(), iv.end());

	for (const auto &e : is)
		cout<< e<< " ";//1 2 3 4 5 6 7 8 9
	cout<< endl;
}

如果想要從大到小排序,則在構(gòu)造的時(shí)候加上greater:

void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };

	set>is(iv.begin(), iv.end());

	for (const auto &e : is)
		cout<< e<< " ";//9 8 7 6 5 4 3 2 1
	cout<< endl;
}
set的模板參數(shù)列表
template, class Alloc = allocator>class set;

T:set中存放元素的類型,實(shí)際在底層存儲(chǔ)的鍵值對(duì)
Compare:set中元素默認(rèn)按照小于來(lái)比較
Alloc:set中元素空間的管理方式,使用STL提供的空間配置器。

set的構(gòu)造
void main()
{sets1;//構(gòu)造空的set
	int ar[] = {8,5,3,7,6,4,2,9,1 };
	int n = sizeof(ar) / sizeof(ar[0]);
	sets2(ar, ar + n);//用(first,last)區(qū)間中的元素構(gòu)造set
	vectorvi = {8,5,3,7,6,4,2,9,1 };
	sets3(vi.begin(), vi.end());//用(first,last)區(qū)間中的元素構(gòu)造set
	s1 = s3;//拷貝構(gòu)造
}
set的迭代器

在這里插入圖片描述

set的修改操作
函數(shù)聲明功能
pairinsert ( const value_type& x )在set中插入元素x,實(shí)際插入的是構(gòu)成的鍵值對(duì),如果插入成功,返回<該元素在set中的位置,true>,如果插入失敗,說(shuō)明x在set中已經(jīng)存在,返回
size_type erase ( const key_type& x )刪除set中值為x的元素,返回被刪除的元素的個(gè)數(shù)
void erase ( iterator position )刪除set中position位置上的元素
void erase ( iterator first, iterator last )刪除set中(first,last)區(qū)間中的元素
size_type count ( const key_type& x ) const返回set中值為x的元素的個(gè)數(shù)
void swap ( set&st)交換set中的元素

swap代碼驗(yàn)證:

void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
	setis(iv.begin(), iv.end());

	vectoriv1 = {6,7,8,3 };
	setis1(iv1.begin(), iv1.end());
	is1.swap(is);
}
void main()
{vectoriv = {8,5,3,7,6,4,2,9,1 };
	setis(iv.begin(), iv.end());

	auto res = is.lower_bound(7);//>=7
	//auto res = is.upper_bound(6);//>6
	cout<< *res<< endl;
}
map 基本介紹
  • map是關(guān)聯(lián)式容器,按照特定次序(按照key來(lái)進(jìn)行比較)存儲(chǔ)由鍵值key和值value組合而成的元素
  • 在map中,鍵值key通常用于排序和唯一的標(biāo)識(shí)元素,而值value中存儲(chǔ)與鍵值key關(guān)聯(lián)的內(nèi)容。鍵值key和值value的類型可能不同,并且在map的內(nèi)部,key與value通過(guò)成員類型value_type綁定在一起,為其取別名稱為pair。
typedef pair value_type;
  • 在內(nèi)部,map中的元素總是按照鍵值key進(jìn)行比較排序的。
  • map中通過(guò)鍵值訪問(wèn)單個(gè)元素的速度通常比unordered_map容器慢,但map允許根據(jù)順序?qū)υ剡M(jìn)行直接迭代。
  • map支持下標(biāo)訪問(wèn)符,即在[]中放入key,就可以得到與key對(duì)應(yīng)的value。
  • map底層通常被實(shí)現(xiàn)為紅黑樹(shù)。
map的模板參數(shù)說(shuō)明
template,//比較器的類型
	class Alloc = allocator>//通過(guò)空間配置器來(lái)申請(qǐng)底層空間
>class map;
map的構(gòu)造
void main()
{mapismap;
	mapismap = {{5,"Student"},{2,"Teacher"},{4,"Job"} };
}
map的迭代器

在這里插入圖片描述

map的元素訪問(wèn)
函數(shù)聲明功能
size_type size() const返回map中有效元素的個(gè)數(shù)
mapped_type& operator[] (const key_type&k)返回key對(duì)應(yīng)的value
void main()
{mapismap = {{5,"Student"},{2,"Teacher"},{4,"Job"} };
	cout<< ismap.size()<< endl;//3
	cout<< ismap.at(4)<< endl;//Job
	cout<< ismap[4]<< endl;//Job
	cout<< ismap[8]<< endl;//""
 	//cout<< ismap.at(9)<< endl;//會(huì)拋出異常
}

在元素訪問(wèn)時(shí),at函數(shù)和operator[]都能通過(guò)key找到與key對(duì)應(yīng)的value然后返回其引用,不同的是:當(dāng)key不存在時(shí),operator[]用默認(rèn)value和key構(gòu)造鍵值對(duì)然后插入,返回該默認(rèn)value,at()函數(shù)直接拋出異常。

map中元素的修改
函數(shù)聲明功能
pairinsert ( const value_type& x )在map中插入鍵值對(duì)x,返回值也是一個(gè)鍵值對(duì),iterator代表新插入元素的位置,bool代表是否插入成功
size_type erase ( const key_type& x )刪除值為x的元素
void erase ( iterator position )刪除position位置上的元素
void erase ( iterator first, iterator last )刪除(first,last)區(qū)間中的元素
size_type count ( const key_type& x ) const返回set中值為x的元素的個(gè)數(shù)
void swap ( set&st)交換set中的元素
const_iterator find ( const key_type& x )const在map中查找key為x的元素,找到返回該元素的位置的const迭代器,否則返回cend
size_type count ( const key_type& x ) const返回key為x的鍵值在map中的個(gè)數(shù),注意map中key是唯一的,因此該函數(shù)的返回值要么為0,要么為1,因此可以用來(lái)檢測(cè)一個(gè)key是否在map中

查找和插入:

void main()
{//2 4 5 8
	mapismap = {{5,"Student"},
	{2, "Teacher"}, {8, "Study"}, {4, "Job"} };

	auto pos = ismap.find(8);//查找,找到返回該元素的迭代器
	cout<< pos->first<< " : "<< pos->second<< endl;
	
	pairv = {1,"abc" };
	ismap.insert(pos, v);//插入,pos表示新插元素的位置

	cout<< pos->first<< " : "<< pos->second<< endl;

	for (const auto& e : ismap)
		cout<< e.first<< " : "<< e.second<< endl;
}
map總結(jié)
  • map中的元素是鍵值對(duì)
  • map中的key是唯一的,并且不能修改
  • 默認(rèn)按照小于的方式對(duì)key進(jìn)行比較
  • map中的元素如果用迭代器去遍歷,可以得到一個(gè)有序的序列
  • map底層為紅黑樹(shù),查找效率較高為以2為底n的對(duì)數(shù)
  • 支持[]操作符,operator[]在實(shí)際中進(jìn)行查找操作

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁(yè)題目:【C++】關(guān)聯(lián)式容器-map和set-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://jinyejixie.com/article48/dcjshp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開(kāi)發(fā)、軟件開(kāi)發(fā)、Google網(wǎng)站設(shè)計(jì)、商城網(wǎng)站、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)
遵义市| 华池县| 平顶山市| 楚雄市| 梨树县| 华池县| 祥云县| 泰兴市| 岳西县| 新乡县| 波密县| 镇巴县| 深水埗区| 依兰县| 淮北市| 四川省| 五指山市| 家居| 贵定县| 资中县| 灌云县| 宝应县| 东乡族自治县| 安平县| 衡阳县| 太原市| 新邵县| 哈尔滨市| 泾阳县| 茌平县| 涿鹿县| 卫辉市| 东乡| 福建省| 淳化县| 塔城市| 南城县| 永川市| 疏附县| 保定市| 西城区|