#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這個 東西 ,點此來由我向你解釋一下吧pairvoid 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_type | The first template parameter (Key) | |
| mapped_type | The second template parameter (T) | |
| value_type | pair<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的大概的知識 ;;;;當然了,,我們學習它 ,,,,就是為了用它,,如果,,你對此感興趣的話,,可以來看看》》》》》
新聞熱點
疑難解答