STL容器——set/multiset

STL容器——set/multiset

1、set概念

  • set的特点是所有元素都会根据元素的键值自动被排序。set的元素不像map那样可以同时拥有值和键,set的元素本身既是键又是值。set不允许两个元素有相同的键值。
  • 不可以通过set的迭代器不能改变set元素的值。因为set元素元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。
  • set拥有和list某些相同的性质,当对容器中的元素进行插入操作或者删除操作的时候,操作之前所有的迭代器,在操作结束后依然有效。

2、multiset概念

  • multiset特性及用法和set完全相同。唯一的差别在于它允许键值重复。set和multiset的底层实现是红黑树,红黑树为平衡二叉树的一种。

  • 二叉树就是任何结点最多只允许有两个子结点。分别是左子节点和右子节点。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7kk2RyH0-1593445429520)(C:\Users\Administrator\Desktop\搜狗截图20200629224504.png)]

  • 二叉搜索树,是指二叉树中的结点按照一定的规则进行排序,使得对二叉树中元素更加高效,二叉搜索树的放置规则是:任何结点的元素值一定大于其左子树中的每一个结点的元素值,并且小于其右子树的值。因此从根结点一直向左走,一直到无路可走,即得到最小值,一直向右走,直至无路可走,可得到最大值。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ay2AVBe7-1593445429525)(C:\Users\Administrator\Desktop\搜狗截图20200629225827.png)]

  • 当一个二叉搜索树左子树和右子树不平衡的时候,在上图搜索9所花费的时间要比搜索17所花费的时间要多,由于我们输入或者经过插入删除操作,二叉树失去平衡,造成搜索效率降低。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LTCiYNLO-1593445429532)(C:\Users\Administrator\Desktop\搜狗截图20200629230608.png)]

3、set构造函数

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

4、set赋值操作

  • set& operator=(const set &st);//重载等号操作符
  • swap(st);//交换两个集合容器

5、set大小操作

  • sise();//返回容器中元素的数目
  • empty();//判断容器是否为空

6、set插入和删除操作

  • insert(elem);//在容器中插入元素
  • clear();//清除所有元素
  • erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器
  • erase(beg,end);//删除区间[beg,end)的所有元素,返回下一个元素的迭代器。
  • erase(elem);//删除容器中值为elem的元素
// 1,3,5,6,9,11 
set<int>::iterator itBegin=setInt.begin();
++ itBegin;
set<int>::iterator itEnd=setInt.begin();
++ itEnd;
++ itEnd;
++ itEnd;
setInt.erase(itBegin,itEnd);
//此时容器 setInt 包含按顺序的 1,6,9,11 四个元素。
//删除容器中第一个元素
setInt.erase(setInt.begin()); //6,9,11
//删除容器中值为 9 的元素
set.erase(9);
//删除 setInt 的所有元素
setInt.clear(); //容器为空

7、set查找操作

  • find(key);//查找key是否存在,若存在,返回该键的元素的迭代器,若不存在,返回set.end();
  • count(key);//查找键key的元素个数
  • lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器
  • upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器
  • equal_range(keyElem);//返回容器中key和keyElem相等的上下限的两个迭代器
set<int> setInt;
setInt.insert(3);
setInt.insert(1);
setInt.insert(7);
setInt.insert(5);
setInt.insert(9);
set<int>::iterator itA = setInt.find(5);
int iA = *itA; //iA == 5
int iCount = setInt.count(5); //iCount == 1
set<int>::iterator itB = setInt.lower_bound(5);
set<int>::iterator itC = setInt.upper_bound(5);
int iB = *itB; //iB == 5
int iC = *itC; //iC == 7

8、对组(pair)

  • 对组(pair)将一对值组合成一个值,这一对值可以具有不同的数据类型,两个值可以分别用pair的两个公有属性first和second访问。
  • 类模板:template <class T1,class T2> struct pair.
  • 创建对组
//第一种
pair<string,int> pair1(string("name"),20);
cout << pair1.first << endl;//访问第一个值
cout << pair1.second << endl;//访问第二个值

//第二种
pair<string,int> pair2=make_pair("name",20);

//pair=赋值
pair<string,int> pair3 = pair2;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值