C++中set用法

一、基本概念

   关于set,必须说明的是set关联式容器。 set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。set内部采用的是一种非常高效的平衡检索二叉树:红黑树,也称为RB树。RB树的统计性能要好于一般的平衡二叉树。

unordered_set:无序集合

multiset:允许容器中有重复的元素

set的迭代器不支持加减数操作。所有C++容器的迭代器都支持自增自减操作。

二、定义及初始化

set的构造函数为:

set<T> s;//默认构造函数
set(const set &st);//拷贝构造函数

定义:set<datatype> s;

1)set<int>s;//定义一个set容器,类型为Int

2)set<vector<int>> s;

3)set<string> s;

初始化

1)vector<string> str;

set<string> s(str.begin(),str.end());//将str元素赋值给set

2)set<int> s1;

set<int> s2(s1);//s1赋值给s2

3)set<int> s3;

s3=s1;//s1赋值给s3

三、常用操作

set中元素默认升序排列,即set中元素有序且唯一

一些函数如下:

1)s.begin();//返回指向第一个元素的迭代器

2)s.end();//返回指向最后一个元素之后的迭代器,不是最后一个元素

3)s.clear();//清除所有元素

4)s.empty();//如果为空,返回true

5)s.erase(val);//删除集合中的元素val

s.erase(s.begin());//删除集合中的第一个元素

但s.erase(s.end())会出错,可以理解为s.begin()指向第一个元素,s.end()指向最后一个元素的下一个元素

6)s.size();//返回集合中元素的个数

7)s.insert(x);//插入元素

8)s.find();//返回一个指向被查找到元素的迭代器,未找到返回s.end();

9)s.count(val);//统计元素val出现的次数,在set中该返回值不是0就是1

10)s.swap(s2);//交换2个set的元素

3.1插入

s.insert(x);//插入元素,如果s中已经存在x,则无法插入

3.2查找

s.find(x);//查找x是否存在,若存在,返回该元素的迭代器,若不存在,返回s.end()

s.count(x);//统计x的个数,结果为0或1

示例如下:

set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);
s.insert(5);

auto it= s.find(3);
cout<<*it<<endl;//3
cout<<s.count(4)<<endl;//为1

3.3删除

s.erase(x);//删除单个元素 ,如果s中存在x就删除,不存在也不会报错
s.erase(s.begin(),s.begin()+3);//区间的删除是左闭右开
s.erase(pos);//删除迭代器指向的元素
s.clear();//删除整个set的所有元素

示例如下:

set<int> s;
   s.insert(1);
   s.insert(2);
   s.insert(3);
   s.insert(4);
   s.insert(5);

  s.erase(5);///1,2,3,4
  s.erase(s.begin(),s.find(2));//2,3,4
  s.erase(s.find(3));//2,4
  s.clear();

3.4遍历

如求set中元素的和

set<int>::iterator iter=s.begin();

while(iter!=s.end())

{

sum+=*iter;

iter++;

}

3.5大小和交换

size();//返回容器中元素数目
empty();//判断容器是否为空
swap(st);//交换2个集合容器

示例如下:

 set<int> s;
   s.insert(1);
   s.insert(2);
   s.insert(3);
   s.insert(4);
   s.insert(5);

   cout<<s.size()<<endl;//5
   cout<<s.empty()<<endl;//0
   set<int> s2;///1,2,3,4,5

3.6排序

set容器默认排序规则为从小到大,可以使用自定义排序规则。可以利用仿函数来实现。

示例1:set存放内置数据类型

 set<int> s;
   s.insert(1);
   s.insert(2);
   s.insert(3);
   s.insert(4);
   s.insert(5);

   for(auto it =s.begin();it!=s.end();it++)
       cout<<*it<<" ";
   cout<<endl;//输出1,2,3,4,5

   set<int,Compare> s2;
   s2.insert(1);
   s2.insert(2);
   s2.insert(3);
   s2.insert(4);
   s2.insert(5);

    for(auto it =s2.begin();it!=s2.end();it++)
        cout<<*it<<" ";
    cout<<endl;//输出5,4,3,2,1

示例2:set存放自定义数据类型

   set<student> s;
   student t1(1,"h1");
   student t2(2,"h2");
   student t3(3,"h3");
   student t4(4,"h4");


   set<student,Compare> s2;
   s2.insert(t1);
   s2.insert(t2);
   s2.insert(t3);
   s2.insert(t4);

    for(auto it =s2.begin();it!=s2.end();it++)
       cout<<(*it).age<<" "<<(*it).name<<" ";
    cout<<endl;//输出4,3,2,1

set存放自定义数据类型时,必须指定排序规则

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值