如果想看map與multimap的使用,可以點下面的這個鏈接----》map與multimap的使用《-----
《一》set
首先,我們先如果要使用set的理解的話,就要和之前一樣,喜歡查文檔,那麼我就把set的文檔鏈接,寫在下面—》set的文檔《—,下面我們就正式進入我們理解,
《1》set的介紹
- set是按照一定次序存儲元素的容器
- 在set中,元素的value也標識它(value就是key,類型爲T),並且每個value必須是唯一的。set中的元素
不能在容器中修改(元素總是const),但是可以從容器中插入或刪除它們。 - 在內部,set中的元素總是按照其內部比較對象(類型比較)所指示的特定嚴格弱排序準則進行排序。
- set容器通過key訪問單個元素的速度通常比unordered_set容器慢,但它們允許根據順序對子集進行直接迭代。
- set在底層是用二叉搜索樹(紅黑樹)實現的。
下面要注意的點是:
- 與map/multimap不同,map/multimap中存儲的是真正的鍵值對<key, value>,set中只放value,但在底層實際存放的是由<value, value>構成的鍵值對。
- set中插入元素時,只需要插入value即可,不需要構造鍵值對。
- set中的元素不可以重複(因此可以使用set進行去重)。
- 使用set的迭代器遍歷set中的元素,可以得到有序序列
- set中的元素默認按照小於來比較
- set中查找某個元素,時間複雜度爲:
- set中的元素不允許修改(爲什麼?)
- 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的介紹
- multiset是按照特定順序存儲元素的容器,其中元素是可以重複的。
- 在multiset中,元素的value也會識別它(因爲multiset中本身存儲的就是<value, value>組成的鍵值對,因此value本身就是key,key就是value,類型爲T). multiset元素的值不能在容器中進行修改(因爲元素總是const的),但可以從容器中插入或刪除。
- 在內部,multiset中的元素總是按照其內部比較規則(類型比較)所指示的特定嚴格弱排序準則進行排序。
- multiset容器通過key訪問單個元素的速度通常比unordered_multiset容器慢,但當使用迭代器遍歷時會得到一個有序序列。
- multiset底層結構爲二叉搜索樹(紅黑樹)。
要注意的是:
- multiset中再底層中存儲的是<value, value>的鍵值對
- mtltiset的插入接口中只需要插入即可
- 與set的區別是,multiset中的元素可以重複,set是中value是唯一的
- 使用迭代器對multiset中的元素進行遍歷,可以得到有序的序列
- multiset中的元素不能修改
- 在multiset中找某個元素,時間複雜度爲
- 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是不去重的。