简介
使用set与multiset时需要包含头文件 <set>
set与multiset让使用者能够在容器中快速查找键(键是储存在一维容器中的值),set和multiset的区别在于set中键值要求唯一,后者可以重复。
set与multiset的内部结构像是二叉树,插入与素时要对元素进行排序,因此,相对于vector,list那些容器,set与multiset在插入新元素时效率较低(有额外排序开销),在元素查找方面效率较高。因此,它们适用于那些需要频繁查找的程序中。set与multiset操作相似,下面的介绍以set为例。
实例化set
实例化一个特定类型的set,以int类型为例:
1 | set<int> intSet; |
set与multiset在元素插入时对其进行排序,默认使用std::less对插入数据进行排序。
要创建二元谓词,可在类中定义一个operator():
1 | template<typename T> |
- 插入元素
1 | >使用成员函数insert()进行元素插入操作。 |
无论使用begin()还是cbegin()获得的迭代器,都不等对*pos进行赋值操作,因为set不允许改变其内元素的值。
set也不能使用 [] 操作符获取元素的值;可以使用迭代器来获取元素值。
- 删除元素
关联容器都提供了成员函数erase()。
1、根据键删除值:
setObject.erase(key);
2、传入一个迭代器,删除迭代器指向的值:
setObject.erase(iElement);
3、使用迭代器指定边界,删除边界内的所有元素:
setObject.erase(iLowerBound, iUpperBound);
1 | set<int> intSet; |
当multiset存在多个相同的值时,用setObject.erase(key)删除值时,会将他们全部删除。
1 | multiset<int> intSet; |
C++11
在C++11中,新增加了散列集合unordered_set和unordered_multiset;它们相对于set和multiset进一步的改善了性能。他们使用散列函数来计算排序索引。
使用时添加头文件<unordered_set>
注意,将对象储存到set或multiset中时,别忘了在类中实现运算符<和==,前者将成为排序谓词,后者用于find()函数。