Set&Multiset

本文详细介绍了C++ STL中set与multiset容器的区别,包括它们的排序规则、内部实现方式以及如何进行构造和非变动性操作。此外还探讨了它们在实际应用中的优势。

  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;
c1c2;
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,删除全部元素






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值