一 set概述:
(1)功能:set可以在时间复杂度为O(logN)情况下插入、删除和查找数据。
(2)set的特性:
*标准STL set以RB-tree为底层机制。
*所有元素都会根据特定的排序准则,根据元素的键值自动将元素排序。
*set元素的键值就是实值,实值就是键值。
*set不允许两个元素有相同的键值。
*set iterators是一种const_iterators,不允许通过迭代器改变其元素的值,因为set元素值就是键值,关系到set的排序准则。要改变元素值,必须先删除旧元素值,再插入新元素。
*对set进行新增和删除操作时,操作之前的所有迭代器,在操作完成之后都依然有效(被删除的那个元素除外)。
(3)set格式:
使用set或multiset,必须包含头文件<set>。
namespace std
{
template<class T
class compare=less<T>//用来定义排序准则,缺省准则less,以operator<对元素进行比较。
class Allocator=allocator<T>>
class set;
template<class T
class compare=less<T>//用来定义排序准则,缺省准则less,以operator<对元素进行比较。如果使用复合类型,需要自己定义用于比较的函数对象。
class Allocator=allocator<T>>
class multiset;
}
二 multiset
*multiset的特性与用法和set完全相同,唯一的差别在于它允许键值重复。
三 set与multiset相应操作:
(1)生成、复制和销毁

(2)非变动性操作:
*元素的比较只能用于型别相同的容器,即元素和排序准则必须有相同的型别,否则编译时期产生型别方面的错误。

(3)特殊的查找函数:
*sets和multisets在元素的快速查找方面有优化设计,所以提供了特殊的查找函数。这些函数是同名的STL算法的特殊版本。
*lower_bound():返回大于或等于参数值的第一个元素所处的位置。
*upper_bound():返回大于参数值的第一个元素的位置。
*equal_range():将lower_bound()和upper_bound()的返回值作为一个pair返回。

(4)赋值和迭代器相关的函数:

(5)元素的安插和删除:
1. 注意:安插函数的返回值型别不相同。
*set提供如下接口:
pair<iterator,bool> insert(const value_type &elem);
iterator insert(Iterator pos_hint,const value_type &elem);
*multiset提供如下接口:
iterator insert(const value_type &elem);
iterator insert(Iterator pos_hint,const value_type &elem);
*不同的原因:multisets允许元素重复,而sets不允许。因此,如果将某元素安插进一个set,而该set已经含有这个元素,则安插操作将告失败。所以set的返回值型别是以pair组织起来的两个值:
*pair结构的first成员,返回新元素的位置,或返回现存元素的位置。
*pair结构的second成员表示安插是否成功。
![]()
本文详细介绍了C++ STL中的set与multiset容器的特性、使用方法及操作,包括生成、复制、销毁、查找、插入与删除等核心功能。特别关注了set与multiset的区别,如允许键重复的特性,以及特殊的查找函数优化。

被折叠的 条评论
为什么被折叠?



