STL之set和multiset

set

set的特性:
– 所有元素都会根据元素的键值自动被排序。
– set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。
– set不允许两个元素有相同的键值。

不可以通过set的迭代器改变set元素的值,因为set元素值就是其键值,关系到set元素的排序规则。如果任意改变set元素值,会严重破坏set组织。换句话说,set的iterator是一种const_iterator.
set拥有和list某些相同的性质,当对容器中的元素进行插入操作或者删除操作的时候,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一个例外。

set的使用

//构造
set<T> setT;
set(const set &st);//拷贝构造函数

//赋值
set& operator=(const set &st);//重载等号操作符

//迭代器
begin();//返回set容器迭代器的第一个
end();//返回set容器迭代器的最后一个
rbegin();//返回反向迭代器,以反向开始
rend();//返回反向迭代器到反向结束
cbegin();//同begin(),但属性为const
cend();//同end(),但属性为const
crbegin();//同rbegin(),但属性为const
crend();//同rend(),但属性为const

//大小
empty();//判断set容器是否为空
max_size();//返回set容器可能包含的元素最大个数
size();//返回当前set容器中的元素个数

//存取和修改
insert();//添加元素
erase();//删除元素
clear();//清理set容器中的所有的元素
emplace(elem,...);//emplace直接传入Node的构造函数的参数,并将构造的元素加入栈中;省去了构造临时对象,减少了内存开销
swap();//swap将两个 stack的内容交换.这两个 stack的模板参数 T和 Container必须都相同
emplace_hint();//构造并插入带有提示的元素
find();//获取元素的迭代器
count();//对具有特定值的元素进行计数

multiset

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