SET的一些知识点

这两天学习了STL,准备找几道题练练手,在这个过程中,总结了一些小的知识点。

1、set集合容器实现了红黑树的二叉检索树的数据结构,在插入元素时,它会自动调整二叉树的排列,把该元素放到适当的位置,以确保每个子树根节点的键值大于左子树所有节点的键值,而小于右子树所有节点的键值。

2、平衡二叉检索树的检索使用中序遍历算法,检索效率高于vector、deque、list容器。将键值由小到大遍历出来,并且不会重复插入相同键值的元素,采取忽略处理。如果是一个结构体其中有三个int型元素a,b,c,如果有插入的a相同,则这组数据被忽略,如插入1  2  3、1  2  4、1   3  4;则只会插入1 2 3,因为首元素相同,所以采取忽略处理。而除首元素其他元素相同则可以插入。

3、iterator迭代器的作用是遍历容器。

4、在5下面有以下知识点的练习。

      创建元素:set<int>s,需要说明元素的类型;

      元素的插入:s.insert(需要插入的元素),如:s.insert(8),插入元素8;

      中序遍历:set<int> :: iterator  it;

                         for( it=s.begin() ; it !=s.end();it++)

                        {

                              cout<<*it<<"  ";

                        }

       反向遍历:set<int> :: reverse_iterator it;

                           for( it=s.rbegin() ; it !=s.rend();it++)

                        {

                              cout<<*it<<"  ";

                        }

      元素的删除:s.erase(6); 删除键值为6的元素;

      元素的查找:set<int>::iterator  it;

                             it=s.find(6);

                            if (it != s.end() )

                                 cout<<“找到该元素”;

5、自定义比较元素:

          1>  不是结构体的元素、按键值由大到小:

#include<set>
#include<iostream>
using namespace std;
//自定义比较函数mycomp,重载"()"操作符
struct mycomp
{
        bool operator ()(const int &a,const int &b)
        {
                   return a>b;
        }
};
int main()
{
        //定义元素类型为int型的集合对象s,当前没有任何元素
        //采用的比较函数是mycomp
        set<int,mycomp>s;
        //插入5个元素,由于8有重复,所以第二次的8并没有执行
        s.insert(8);
        s.insert(1);
        s.insert(12);
        s.insert(6);
        s.insert(8);//第二次插入8,重复元素,不会插入
        set<int,mycomp>::iterator it;
        for(it=s.begin();it!=s.end();it++)
          cout<<*it<<" ";
        cout<<endl;
        return 0;
}

运行结果:

    12  8  6  1

       

2>如果元素是结构体,那么直接可以把比较函数写在结构体内。下面的程序说明了如何操作:

#include<set>
#include<iostream>
using namespace std;
struct INFO
{
        string name;
        float score;
        bool operator < (const INFO &a) const
        {
                return a.score<score;
        }
};
int main()
{
        //定义元素类型为INFO结构体的集合对象s,当前没有任何元素
        set<INFO>s;
        INFO info;
        info.name="Jack";
        info.score=80.5;
        s.insert(info);
        info.name="Tomi";
        info.score=20.5;
        s.insert(info);
        info.name="Nacy";
        info.score=60.5;
        s.insert(info);
        set<INFO>::iterator it;
        for(it=s.begin();it!=s.end();it++)
        {
                cout<<(*it).name<<":"<<(*it).score<<endl;
        }
        return 0;
}

运行结果:

Jack:80.5

Nacy:60.5

Tomi:20.5

 


 


   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值