C++ set / multiset 主要包括:《set的介紹與使用》《multiset的介紹和使用》《set與multiset的區別》

如果想看map與multimap的使用,可以點下面的這個鏈接----》map與multimap的使用《-----

《一》set
首先,我們先如果要使用set的理解的話,就要和之前一樣,喜歡查文檔,那麼我就把set的文檔鏈接,寫在下面—》set的文檔《—,下面我們就正式進入我們理解,

《1》set的介紹

  1. set是按照一定次序存儲元素的容器
  2. 在set中,元素的value也標識它(value就是key,類型爲T),並且每個value必須是唯一的。set中的元素
    不能在容器中修改(元素總是const),但是可以從容器中插入或刪除它們。
  3. 在內部,set中的元素總是按照其內部比較對象(類型比較)所指示的特定嚴格弱排序準則進行排序。
  4. set容器通過key訪問單個元素的速度通常比unordered_set容器慢,但它們允許根據順序對子集進行直接迭代。
  5. set在底層是用二叉搜索樹(紅黑樹)實現的。

下面要注意的點是:

  1. 與map/multimap不同,map/multimap中存儲的是真正的鍵值對<key, value>,set中只放value,但在底層實際存放的是由<value, value>構成的鍵值對。
  2. set中插入元素時,只需要插入value即可,不需要構造鍵值對。
  3. set中的元素不可以重複(因此可以使用set進行去重)。
  4. 使用set的迭代器遍歷set中的元素,可以得到有序序列
  5. set中的元素默認按照小於來比較
  6. set中查找某個元素,時間複雜度爲:log2nlog_2 n
  7. set中的元素不允許修改(爲什麼?)
  8. set中的底層使用二叉搜索樹(紅黑樹)來實現。

《1.1》set的使用
在使用之前我們先看一下在文檔裏面,我們有什麼常用的接口,大家可以打開上面的文檔是一樣的,這裏我就舉例一下,讓大家看一下,文檔裏面是什麼,看下面的部分接口。
在這裏插入圖片描述
點開文檔裏面就會是這些文檔,隨便點開,裏面是介紹函數的使用,庫什麼的,可以看一看,下面,我們就大概使用一下,因爲之前的很多接口,我們在前面的list/vector/string/都是用過了。
我們看下面的一段代碼

#include<set>


void test_set()
{
	set<int> s;
	s.insert(1);
	s.insert(5);
	s.insert(5);
	s.insert(3);
	s.insert(5);
	s.insert(5);
	s.insert(4);
	s.insert(5);
	s.insert(2);
	s.insert(5);

	set<int>::iterator it = s.begin();   //迭代器使用
	while (it != s.end())
	{
		cout << *it<<" ";
		++it;
	}
	cout << endl;

	for (auto e : s) //範圍for
	{
		cout << e << " ";
	}
	cout << endl;

	auto it1 = find(s.begin(), s.end(), 5); //O(N)
	auto it2 = s.find(5); //O(logN)

}
int main()
{
	test_set();
	return 0;
}

下面我們看一下程序的執行結果:
在這裏插入圖片描述
我們由程序的結果可以看出,set是支持迭代器和範圍for的,並且又排好了序,很方便,最重要的是,他還去了重,就是代碼中,重複出現的5。我們可以看到文檔裏面還有很多的接口,但是我們這裏就先說這麼多,後面我們就看看map,因爲在後面實現二叉搜索樹,AVL樹,紅黑樹的時候,還要使用到呢,不用着急。——搜索樹的key不允許改

《二》multiset

《1》multiset的介紹

  1. multiset是按照特定順序存儲元素的容器,其中元素是可以重複的。
  2. 在multiset中,元素的value也會識別它(因爲multiset中本身存儲的就是<value, value>組成的鍵值對,因此value本身就是key,key就是value,類型爲T). multiset元素的值不能在容器中進行修改(因爲元素總是const的),但可以從容器中插入或刪除。
  3. 在內部,multiset中的元素總是按照其內部比較規則(類型比較)所指示的特定嚴格弱排序準則進行排序。
  4. multiset容器通過key訪問單個元素的速度通常比unordered_multiset容器慢,但當使用迭代器遍歷時會得到一個有序序列。
  5. multiset底層結構爲二叉搜索樹(紅黑樹)。

要注意的是:

  1. multiset中再底層中存儲的是<value, value>的鍵值對
  2. mtltiset的插入接口中只需要插入即可
  3. 與set的區別是,multiset中的元素可以重複,set是中value是唯一的
  4. 使用迭代器對multiset中的元素進行遍歷,可以得到有序的序列
  5. multiset中的元素不能修改
  6. 在multiset中找某個元素,時間複雜度爲O(log2N)O(log_2 N)
  7. multiset的作用:可以對元素進行排序

《1.2》multiset的使用

和上面一樣,我們先看一下—》multiset文檔《—查看裏面的內容,

下來我們就看下面的一段代碼,來了解一下multiset的使用,:

void test_multiset()
{
	multiset<int> s;
	s.insert(4);
	s.insert(3);
	s.insert(4);
	s.insert(2);
	s.insert(4);
	s.insert(5);
	s.insert(4);
	s.insert(1);
	s.insert(4);

	multiset<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;

	it = s.find(2);
	cout << *it << endl;
	++it;
	cout << *it << endl;
	++it;

}

int main()
{
	//	test_set();
	test_multiset();
	return 0;
}

這裏的使用其實和set是一樣的,就是結果他是不一樣,下面,我們看一下程序的執行結果;
在這裏插入圖片描述
由執行結果,我們可以看出**,multiset是沒有去重的,而set它是去重的**,個有個的好處,下面,我們還要說出他們的去別的,這裏主要就要記住,set是去重的,multiset是不去重的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章