1. 程式人生 > >C++STL容器---set容器

C++STL容器---set容器

一、定義

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允許重複元素的鍵值插入