【C++】STL常用容器总结之九:集合set

#10、集合set
Map容器是键值对的集合,而set容器只是单纯的键的集合,当只想知道一个值是否存在时,使用set容器是最合适的。在set中,所有元素都会根据其键值被自动排序,同时set中不允许两个元素有相同的键值。
##1、set容器的一些操作
Set容器支持大部分的map操作,主要包括以下几种操作:
###1、声明set对象

set<T> s;  // 创建一个名为s的空set,T是类型名。
set<T> s(s2);  // 创建容器s2的副本s。
set<T> s(b, e);  // 创建s,其元素是迭代器b和e标示的范围内元素的副本。

###2、set的插入操作
s.insert(key_value);
将key_value插入到set中,返回值是pair<set<int>::iterator, bool>,bool标志着插入是否成功,而iterator代表插入的位置,若key_value已经在set中,则iterator表示key_value在set中的位置。如果key_value不存在,则插入;否则不进行任何操作。
s.insert(iter, key_value);
在指定的迭代器位置插入key_value,返回该迭代器。
s.insert(begin, end);
将迭代器begin到end之间的元素插入到set中,返回值是void。
###3、set的访问操作
s.count(k);
返回s中键值等于k的元素的个数,这个函数在set并不是很实用,因为一个键值在set只可能出现0或1次,这样就变成了判断某一键值是否在set出现过了。
s.find(k);
如果查找到键值k,则返回该键值的迭代器位置;否则,返回集合最后一个元素后面的一个位置,即end()。
###4、set的删除操作

s.erase(key_value);  // 删除键值为v的值
s.erase(iter);  // 删除迭代器iter所指向的元素
s.erase(iterator first, iterator last);  // 删除两个迭代器之间的值

Set不支持下标操作,在set容器中value_type不是map的pair类型,而是key_type类型,这就体现了set存储的元素仅仅是键,没有所关联的值。与map一样,set容器存储的元素必须唯一,而且不能修改。
###5、set与大部分容器通用的一些方法:

begin();  // 返回set容器的第一个元素。
end();  // 返回set容器的最后一个元素的下一个位置。
clear();  // 删除set容器中的所有的元素。
empty();  // 判断set容器是否为空。
max_size();  // 返回set容器可能包含的元素最大个数。
size();  // 返回当前set容器中的元素个数。
rbegin();  // 返回set容器的最后一个元素。
rend();  // 返回set容器的第一个元素的前一个位置。

##2、set和map的区别
STL中:map的节点是一对数据,set的节点是一个数据。
集合set,包含了经过排序了的数据,这些数据的值(value)必须是唯一的。
映射map,是经过排序的二元组的集合,map中的每个元素都是由两个值组成,其中的key(键值,一个map中的键值必须是唯一的)在排序或搜索时使用,它的值可以在容器中重新获取;而另一个值是该元素关联的数值。
Map是映射,集合中的元素不能重复;set可以进行集合的各种操作(交并补等),当然你也可以用list或vector实现set,但是效率会很低。Set一般是用平衡树或哈希表实现的。映射是一种一一对应的关系,哈希表也可以看作是映射的一种。映射通常可用来实现字典结构。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值