国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

map/set(pair) 這些你懂嗎???

2019-11-08 19:40:15
字體:
來源:轉載
供稿:網友

map/set

 map/set?????    到底說的是什么呢 ???、很多人在刷題的時候可能會見過這兩個名詞、???   ,,,,但是你大概不知道這是什么意思????那么,,我就來向你解釋一下這兩個名詞到底是什么意思了!!!!!!!!其實,說到底,,,,這兩個就是系統為我們實現的兩種二叉樹《《《《;;;;;但是這兩種有一個共同之處,,,,那就是這兩種結構的底層實現都是   使用的紅黑樹 ,,,,,通俗點說的話就是,這兩種結構就是兩種不同形態的紅黑樹。。。。。那么,,,,,現在我們先了解一下這個set使用方法》》》》》

set

set的第一條規則就是這是一個 K 結構的紅黑樹。。。。。下面我們我們通過一段代碼來初步了解一下set的功能。。。。。
#PRagma  once#include <iostream>using namespace std;#include<set>    //如果要是使用 set的結構 ,,,就要添加此頭文件void  Testset(){	set<int> testset;	int arr[] =  {1,45,6,87,45,56,55,0,7,5};	for(size_t i = 0 ;i < sizeof(arr)/sizeof(arr[0]);++i)	{		testset.insert(arr[i]);	}	//其實set就是這個一個容器 ,,,,在這里使用迭代器輸出這個set;;;;	set<int>::iterator it= testset.begin();	while(it!= testset.end())	{		cout<<*it<<" ";		++it;	}	cout<<endl;};最后生成的結果是 :::通過這個結果顯示,,我們可以明確的看出    ,生成的set的結構 中沒有將數組中 重復的數字   輸出。。。。因此 ,我們可以看出set結構插入的時候 ,,,不會插入相同的元素 (紅黑樹都有這個特性)另外 ,輸出的結果都是有序的,,,,,因此,,,,我們可以得出set的幾個功能:::1、、、消除冗余的效果 ;;;;2、、、對于一組不重復的數,達成排序的效果 。。。。下面我們來看看庫中,,,為我們實現的set的結構的一些操作函數。。。在此圖中我們可以看出 ,,,,set類的一系列組成;;;其中 ,,,,T   表示   的就是 set樹中 的存儲元素。。。。Compare  表示   的就是   輸出的元素順序,,,(是升序還是降序,,,,,,在這里的缺省值是升序)Alloc   表示   的就是    空間適配器。。。。。。。     (現在還不是很懂 )下面是些  set的一些基本函數的用法;;;;;這些就是 set 實現的函數   ;;;;我在這里來 主要講一下  insert函數   ::::庫函數 為  我們提供的insert函數  ,,,重載了三種方式  ;;;下面我就向大家  來分別來  演示 一下  這三類重載函數的應用場景:::場景1 、、、、函數原型 是
	pair<iterator,bool> insert (const value_type& val);此處的  value_type  表示類型就是 我們經常說的  K  類型  ,,,也就是set定義的T類型此函數的返回值   類型為    pair<iterator,bool>可能  你之前沒有 聽過pair這個 東西 ,點此來由我向你解釋一下吧pair 
void  Testset(){	set<int> testset;	int arr[] =  {1,45,6,87,45,56,55,0,7,5};	for(size_t i = 0 ;i < sizeof(arr)/sizeof(arr[0]);++i)	{		testset.insert(arr[i]);	}	pair<set<int>::iterator,bool>  ret =  testset.insert(100);	cout<< * ret.first<<","<<ret.second<<endl;	ret =  testset.insert(100);	cout<< * ret.first<<","<<ret.second<<endl;}顯示的結果:通過此我們可以看出 :::如果 要是插入的元素已存在,,那么返回的pair類型 中的迭代器first為原有元素的迭代器,bool量second為false如果 要是插入的元素不存在,,那么返回的pair類型 中的迭代器first為插入元素的迭代器,bool量second為true此種用法我們可以用來解決下列問題:::1、判斷插入的數據 是否重復;;;2、用來刪除一組數據中重復的元素;;;;3、排序一組無重復的數;;;;場景2、、、、、函數原型 
iterator insert (iterator position, const value_type& val);這就是我們 ,,,一般熟悉的一種場景 ,,,,在一個迭代器的之前插入這個數據,,,,返回插入元素的迭代器。。。。場景3、、、函數
template <class InputIterator>void insert (InputIterator first, InputIterator last);這是一個模板函數,,,,,,可以將一段數據插入到這個set紅黑樹中 ,,,,使用實例:::
void  Testset(){	set<int> testset;	int arr[] =  {1,45,6,87,45,56,55,0,7,5};	for(size_t i = 0 ;i < sizeof(arr)/sizeof(arr[0]);++i)	{		testset.insert(arr[i]);	}	int   a[] = {100,200,300,400};	testset.insert(a,a+4);	set<int>::iterator it= testset.begin();	while(it!= testset.end())	{		cout<<*it<<" ";		++it;	}	cout<<endl;}插入后輸出的結果::    使用此類函數時,,,,需要注意的是:::插入的迭代器必須可以 運用(++)(!=)這兩個運算符;;;set給我們提供的刪除函數 erase(),,也向我們提供了幾種方法重載的這些方法 ,,,我們 也很容易理解 ,,,,(1)  參數是一個迭代器   這就是 要刪除  迭代器參數位置上的那個數據;;;如果給的迭代器無效 ,,,,編譯器就會報錯 ,,,(2) 參數是 一個數據,,,也就是 要一個在set中值為val的節點 ;;;返回值為刪除節點的個數(3)  參數為一段迭代器區間也就是 是 說 要刪除 set的一段數據 ,,,,但是 所給的迭代器必須有效;;;下面是這些方法使用實例:::
void Print(set<int> &s){	set<int>::iterator it= s.begin();	while(it!= s.end())	{		cout<<*it<<" ";		++it;	}	cout<<endl;}void  Testset(){	set<int> testset;	int arr[] =  {1,45,6,87,45,56,55,0,7,5};	for(size_t i = 0 ;i < sizeof(arr)/sizeof(arr[0]);++i)	{		testset.insert(arr[i]);	}	Print(testset);	set<int>::iterator it =  testset.find(5);	testset.erase(it);//場景1的使用	Print(testset);	size_t  n =  testset.erase(45);//場景2的使用 	Print(testset);	testset.erase(testset.begin(),testset.end());//場景3的使用	Print(testset);	}生成的結果:如果要是場景一的刪除的迭代器無效,,,,系統會提示這樣的一個斷言錯誤:::另外,,,,,要是想要顯示輸出的數據元素 ,,,按照降序排列的話 ,,可以 這樣建立一個set的對象 :::
set<int,greater<int>>  s;

 map

關于map這種結構,,我呢,,,就不要詳細說了  ,,,,它的使用幾乎與  set是一致的。。。。但大概還有一些區別 ,,,下圖為map的聲明的原型 ,,,上面的大部分和set是一模一樣的;;;只是這里的map是 K—V結構的一種 紅黑樹吧!!!另外,,,,map的插入函數,,也和 set有區別:::如果使用的     是    像 set一樣的插入的話 ,,,,代碼該是這樣的:
map<int ,int>  m;	m.insert(1,2);但是,,如果這樣寫的話,,,編譯器會提示報錯 ,,,,為什么呢 ???我們看看系統為我們提供的這種 插入函數就知道是怎么回事了 ???大概一看,,和 set是一樣的,,,但是 這里的value_type  指的是 一個pair 結構
key_typeThe first template parameter (Key) 
mapped_typeThe second template parameter (T) 
value_typepair<const key_type,mapped_type>
所以我們插入的時候 ,,,要這樣的使用,,才能有效
map<int ,int>  m;	m.insert(pair<int,int>(1,2));為什么要這樣寫呢 ???1】是為了 可觀。。。。2】是為與set對應。。。。其他的一個十分重要的一點(與set相對比)是 :::就是 map在這里  ,,,重載了 Operator[]   ,,,,這是一個很關鍵的地方 。。。。下面是函數的原型:::在這里的作用有很多,,,,我們來這重載的代碼來演示一下吧!!!!
T& operator[](const K& key){	iterator it = find(key);//先在map里查找這個元素key	if(it == end())//沒找到的話	{		it = insert(pair<k,T>(key,T())); //將這個數據插入到map中,,T為缺省值	}	return it->second;//返回值,,,,元素key的節點 V的引用}也就是說,我們可以快速的通過 [key]  來找到它所對應的T值,,,,這就是map、set的大概的知識 ;;;;當然了,,我們學習它 ,,,,就是為了用它,,如果,,你對此感興趣的話,,可以來看看》》》》》
上一篇:map和set插入

下一篇:git常見命令總結

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 定兴县| 顺平县| 自贡市| 望谟县| 江门市| 乐东| 伊宁市| 和顺县| 奉新县| 邵武市| 砚山县| 吴桥县| 徐州市| 松溪县| 黎城县| 读书| 武平县| 金川县| 宁明县| 厦门市| 新河县| 三亚市| 吉隆县| 吉林市| 随州市| 翁牛特旗| 武陟县| 乌鲁木齐县| 资溪县| 开化县| 荆门市| 卢龙县| 丹东市| 民丰县| 大化| 海伦市| 乡城县| 易门县| 牡丹江市| 邵阳市| 江口县|