set 和multiset 都会根据特定的排序规则将元素排序。区别在于multiset允许元素重复,而set不允许。
排序准则定义:1.反对称的 ,op(x,y)为真,则op(y,x) 为假。
2.可传递的,op(x,y)为真,op(y,z)为真,则op(x,z)为真。
3.非自反的,op(x,x)永远为假。
set和multiset都以rb-tree实现。o(lgn)的复杂度,大大提升了排序的速度。
#include
namespace std
{
template
,//定义排序准则,
//如没有特别定义,就使用缺省准则less(operator<)
class Allocator =allocator
>//定义内存模型
class set;
template
, class Allocator =allocator
> class multiset; } //Set和Multiset的构造 set
//以less(perator<)为排序准则 set
//以Op为排序准则 multiset
//以less(perator<)为排序准则 multiset
//以Op为排序准则 //非变动性操作 //Set和Multiset的非变动性操作 set< > c1,c2; c1.size();//返回容器大小 c1.empty();//判断容器是否为零 c1.max_size();//返回可容纳的最大元素数量 c1==c2; c1!=c2; c1
c2; c1<=c2; c1>=c2;//比较动作系列以“字典顺序”来判断两个容器是否相等 //但必须是同类型的 //Set和Multiset的搜寻函数 count(elem);//返回元素值为elem的元素个数 find(elem);//返回元素值为elem的第一个元素,找不到就返回end() lower_bound(elem);//返回elem<=元素值的第一个元素位置用于插入elem upper_bound(elem);//返回elem
<元素值的第一个元素位置用于插入elem equal_range(elem); 将lower_bound()和upper_bound()的返回值做成一个pair返回 所以返回的是一个区间 赋值 set和multiset的赋值操作 c1="c2;//将c2的值全部赋值给c1" c1.swap(c2); c1和c2的值全部互换 swap(c1,c2); 同上,但是全局函数 迭代器相关函数 set和multiset的迭代器相关函数 c.begin(); 指向第一元素的双向迭代器 c.end(); 指向最后一个元素的下一位的双向迭代器 c.rbegin(); 逆向遍历时的第一个元素,逆向迭代器 c.rend(); 逆向遍历时最后一个元素的下一位,逆向迭代器 set和multiset的元素插入和移除 c.insert(elem); 返回新元素的位置 c.insert(pos,elem); 返回新元素的位置(pos作为插入操作的提示) c.insert(beg,end); 将区间[beg,end]内所有的所有元素插入至c c.erase(elem); 删除与elem相等的所有元素,返回删除的个数 c.erase(pos); 删除迭代器pos上所指的元素,无返回值 c.erase(beg,end); 删除[beg,end]内的所有元素,无返回值 c.clear(); 清空c,删除全部元素 < code>