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允许重复元素的键值插入

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_38345598/article/details/86217798