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

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

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

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

鍵值對

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

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

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)
	{}
};

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

int main()
{pairv;//v被定義為鍵值對類型,那就有了兩個成員變量
	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是按照一定次序存儲元素的容器。
  • 在set中,元素的value也標(biāo)識它,value就是key,類型為T,并且每個value必須是唯一的。set中的元素不能在容器中修改,但是可以在容器中進行插入和刪除。
  • set容器通過key訪問單個元素的速度通常比unordered_set容器慢,但是它們允許根據(jù)順序?qū)ψ蛹M行直接迭代。
  • set在底層是用紅黑樹實現(xiàn)的。

注意:

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

驗證set中的元素默認按照小于進行排序:

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)造的時候加上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中存放元素的類型,實際在底層存儲的鍵值對
Compare:set中元素默認按照小于來比較
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,實際插入的是構(gòu)成的鍵值對,如果插入成功,返回<該元素在set中的位置,true>,如果插入失敗,說明x在set中已經(jīng)存在,返回
size_type erase ( const key_type& x )刪除set中值為x的元素,返回被刪除的元素的個數(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的元素的個數(shù)
void swap ( set&st)交換set中的元素

swap代碼驗證:

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

在這里插入圖片描述

map的元素訪問
函數(shù)聲明功能
size_type size() const返回map中有效元素的個數(shù)
mapped_type& operator[] (const key_type&k)返回key對應(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;//會拋出異常
}

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

map中元素的修改
函數(shù)聲明功能
pairinsert ( const value_type& x )在map中插入鍵值對x,返回值也是一個鍵值對,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的元素的個數(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中的個數(shù),注意map中key是唯一的,因此該函數(shù)的返回值要么為0,要么為1,因此可以用來檢測一個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中的元素是鍵值對
  • map中的key是唯一的,并且不能修改
  • 默認按照小于的方式對key進行比較
  • map中的元素如果用迭代器去遍歷,可以得到一個有序的序列
  • map底層為紅黑樹,查找效率較高為以2為底n的對數(shù)
  • 支持[]操作符,operator[]在實際中進行查找操作

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

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

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

廣告

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

營銷型網(wǎng)站建設(shè)