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

首頁 > 學院 > 開發(fā)設計 > 正文

【STL】map和set的基本用法

2019-11-08 03:21:12
字體:
來源:轉載
供稿:網(wǎng)友

本篇文章,主要通過了map和set的對比,介紹了STL中的map/set兩種容器的用法以及區(qū)別;并介紹了map/set的底層實現(xiàn)原理;簡單提及了一下關聯(lián)式容器和順序式容器的區(qū)別

pair

說明:

是一個結構體類型,里面的兩個成員變量的類型可以通過模板給定;介紹pair的原因是,在map的insert方法中,需要插入pair類型的元素

定義:

template<class T1,class T2> struct pair;

模擬實現(xiàn):

template<typename T1,typename T2>struct Pair{	typedef T1 first_type;	typedef T2 second_type;	T1 first;	T2 second;	Pair()		:first_type(T1())		, second_type(T2())	{}	Pair(const T1 &x, const T2 &y)		:first_type(x)		, second_type(y)	{}	//拷貝構造函數(shù)	template<typename U,typename V>	Pair(const Pair<U, V> &p)		: first(p.first)		, second(p.second)	{}};

set

簡介:

set是STL中的一個容器,和vector不同的是,set是一種關聯(lián)式容器;

關聯(lián)式容器的底層是用紅黑樹實現(xiàn)的;

紅黑樹是一顆近似平衡的搜索二叉樹,在對元素的查找中有很高的效率;

其查詢一個元素的時間復雜度為O(lg(N))

定義:

接口的使用:

<1>構造一個set類型的變量

set<int> s;

<2>insert() --- 插入一個元素

- 1 第一個insert返回的是一個pair類型的變量,其包含兩個成員,第一個成員的類型是該map迭代器的類型,另一個成員的類型是bool

若map沒有新插入的元素,那么插入成功,返回的是插入節(jié)點的迭代器以及TRUE;

若該元素在map中已經(jīng)存在,那么插入會失敗,返回的是該元素已經(jīng)存在節(jié)點的迭代器,以及FALSE;

	//構造一個int類型的set	set<int> s;	//插入幾個元素	s.insert(1);	s.insert(2);	s.insert(6);	//測試insert()的返回值	pair<set<int>::iterator, bool> ret;	ret = s.insert(4);//set中還沒有4這個元素,插入成功,返回插入節(jié)點的迭代器和TRUE	ret = s.insert(4);//set中已經(jīng)存在了4,插入失敗,返回的是元素4的迭代器和FALSE

- 2 該insert插入的是一段迭代器區(qū)間 

	//定義一段vector,類型也是int	vector<int> v;	v.push_back(10);	v.push_back(50);	v.push_back(5);	//用insert向set s中插入該vector的全部	s.insert(v.begin(), v.end());<3>利用迭代器訪問元素

	//定義一個對應類型的迭代器,指向s的起始	set<int>::iterator it = s.begin();	//當it沒有指向s的最后一個元素的后一個元素時,訪問	while (it != s.end())	{		cout << *it << " ";		it++;//迭代器自增,指向下一個元素	}	cout << endl;反向迭代器也是類似的用法,這里就不多說了

<4>erase() ---刪除一個元素或一段區(qū)間

- 1 用erase() 刪除一個元素,傳入刪除元素的迭代器

- 2 用erase()刪除一個元素,穿入一個key值,返回的是刪除該key值節(jié)點的個數(shù)

- 3 刪除一段迭代器區(qū)間

        //1.用find查找1這個元素,并用迭代器it獲取返回值,然后進行刪除	set<int>::iterator it = s.find(500);	if (it != s.end())                  //查詢成功,則表示元素存在,刪除該元素		s.erase(it);	else		              //若查詢失敗,表示不存在,對it解引用會是NULL		cout << "沒有找到" << endl;	//2.直接刪除一個key值	s.erase(2);	//3.刪除一段迭代器區(qū)間	s.erase(s.begin(), s.end());

<5>find() --- 用來查找一個元素,若查找到,則返回該元素對應的迭代器,否則返回最后一個元素的下一個元素

在刪除的時候已經(jīng)用過

<6>count() 

 統(tǒng)計一個元素的個數(shù),在set中用于判斷一個元素是否存在;因為無法插入相同的值,所以在set/map中與find的作用一樣

<7>emplace()

emplace和insert都是向set中插入一個元素,但效率上看,emplace的效率要高一點

insert是先構造好,然后又經(jīng)過一次拷貝構造放入set中;

而emplace是直接在set中進行構造

map

簡介:

map也是一種關聯(lián)式容器,與set不同的是,它是一種 Key/Value 結構的容器;

map的幾種用途:

做英語詞典、統(tǒng)計水果出現(xiàn)的個數(shù)

定義:

接口的使用:

<1> 定義一個map

map<string,int> countMap;

<2>insert() 

- 1 插入一個pair

map<string, int> m;m.insert(pair<string, int>("hello", 0));m.insert(pair<string, int>("world", 1));- 2 插入一個value_type
m.insert(map<string, int>::value_type("change", 1));- 3 利用數(shù)組下標進行插入,這里的K值需要是int
map<int, string> m;m[0] = "first";m[1] = "second";m[2] = "third";

<3>erase() 元素的刪除

- 1 迭代器刪除

map<string, int>::iterator it = m.find("hello");if (it != m.end())m.erase(it);- 2 key值刪除

m.erase("hello");

<4> find() 查找元素

和set相同,查找成功返回對應的迭代器,否則返回最后一個元素的下一個位置

<5>count()

統(tǒng)計個數(shù),但是由于不允許出現(xiàn)重復的Key值,所以和find()作用類似


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 京山县| 云浮市| 阳谷县| 和静县| 伊宁市| 承德市| 美姑县| 泽普县| 嵊泗县| 景泰县| 林甸县| 象山县| 建湖县| 满城县| 新郑市| 连山| 宜宾市| 德州市| 博野县| 如东县| 乳山市| 福海县| 德安县| 绥阳县| 唐海县| 大兴区| 晋江市| 垦利县| 灌南县| 安多县| 乡城县| 诸城市| 吐鲁番市| 商洛市| 株洲市| 灵石县| 黑水县| 正安县| 蒙山县| 白山市| 铁岭县|