您的位置:首页 > 编程语言 > C语言/C++

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

2016-08-25 12:28 483 查看

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一般是用平衡树或哈希表实现的。映射是一种一一对应的关系,哈希表也可以看作是映射的一种。映射通常可用来实现字典结构。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ STL set 容器