C++STL容器---set容器
阿新 • • 發佈:2019-01-14
一、定義
set 集合容器相當與實現了二叉排序樹,在插入元素的時候,它會自動的調整二叉樹的排列,把該元素放到適當的位置,以確保每個子樹上面得到根節點的鍵值大於左子樹所有節點的鍵值,小於右子樹的所有節點的鍵值。另外還要同時確定根節點的左子樹的高度與右子樹的高度相等,這樣來說,二叉樹的高度最小,從而檢索速度最快。同樣的它不會插入重複的鍵值。將元素自動排序
二、目的
使用set的目的就是為了快速的檢索資料,如果修改了其中一個鍵值的話,就會導致整個子樹的改變。
三、用法
set<type>Name ;//定義了一個元素型別為type ,變數名稱為Name 的set容器
Name.insert(1);//向Name容器中插入數值為1
s.erase(6);//刪除鍵值為6的元素
s.clear();//對應s的清空
s.size();//返回s的大小
s.find(1);//尋找鍵值為1的位置(迭代器)
s.empty();//判斷s是否為空
lower_ bound(keyelem);//返回第一個key<=keyelem元素的迭代器
upper_bound(keyelem);//返回第一個key>keyelem元素的迭代器
equal_range(keyelem);//返回容器中key與keyelem相等的上下限的倆個迭代器
四、程式碼實現
#include<set> #include<iostream> #include<cstring> using namespace std; int main(int argc,char *argv[]) { set<int >s;//定義了一個set 物件 s.insert(1);//插入元素 s.insert(10); s.insert(23); s.insert(45); s.insert(50); s.insert(12); s.insert(24); set<int>::iterator it; for(it=s.begin();it!=s.end();it++) cout<<*it<<" "<<endl; set<int>::reverse_iterator rit; //定義了反向迭代器 cout<<"這是反向迭代的結果"<<endl; for(rit=s.rbegin();rit!=s.rend();rit++) cout<<*rit<<" "<<endl; s.erase(1); cout<<"這是刪除1的結果"<<endl; for(it=s.begin();it!=s.end();it++) cout<<*it<<" "<<endl; set<int>::iterator findindex; findindex=s.find(50); if(findindex!=s.end()) cout<<"所要尋找的數為"<<*findindex<<" "<<endl; else cout<<"沒找到"<<endl; }
自定義比較函式(按照一定的順序插入元素)
#include<iostream>
#include<cmath>
#include<string>
#include<set>
using namespace std;
//自定義比較函式,所以過載了()的操作符!!!!!!!
struct myComp
{
bool operator()(const int &a,const int &b)
{
if(a!=b)
return a>b;
else
return a>b;
}
};
int main(int argc,char *argv[])
{ set<int,myComp> s;
s.insert(23);
s.insert(12);
s.insert(78);
s.insert(212);
set<int,myComp>::iterator it;
//定義的向前的迭代器
for(it=s.begin();it!=s.end();it++)
{
cout<<*it<<" "<<endl;
}
return 0;
}
執行結果:
順序新增結構體元素
#include<iostream>
#include<set>
#include<algorithm>
using namespace std;
struct Data//定義了一個結構體
{
string name;
float score;
bool operator <(const Data &a)const
{ return a.score<score;
}
};
int main(int argc,char *argv[])
{
set<Data>s;
Data data;
data.name="121";
data.score=100;
s.insert(data);
data.name="adas";
data.score=11;
s.insert(data);
data.name="qweq";
data.score=23;
s.insert(data);
set<Data>::iterator it;
for(it=s.begin();it!=s.end();it++)
cout<<(*it).name<<" :"<<(*it).score<<endl;
return 0;
}
執行結果:
multiset允許重複元素的鍵值插入