STL容器Set和Multisets使用

来源:互联网 发布:网络安全员日常工作 编辑:程序博客网 时间:2024/05/22 14:52

STL容器Set和Multisets使用

简介

set和multiset会根据特定的排序准则,自动将元素排序。两者不同指出是multisets允许元素重复而sets不允许。它们通常都是以平衡二叉树实现的。

注意:由于set和multiset是自动排序的,故不能直接改变元素值,因为这样会打乱原本正确的顺序。故要改变元素值,必须先删除旧元素,再插入新元素。其提供的接口反映了这种行为:

sets和multisets不提供用来直接存取元素的任何操作函数
通过迭代器进行元素简介存取,有一个限制:从迭代器角度看,元素值是常数。

操作函数

  • 构造析构函数

set c:产生一个空的set/multiset,其中不含任何元素
set c(op):以op为排序准则,产生一个空的set/multiset
set c1(c2):产生某个set/multiset的副本,所有元素均被复制
set c(beg, end):以区间[beg; end]内的元素产生一个set/multiset
set c(beg, end, op):以op为准则,利用[beg; end]内的元素生成一个set/multiset
c.~set():销毁所有元素,释放内存
set< Elem >:一个set,与less\<>(operator<)为排序准则
set< Elem, Op >:一个set,以op为排序准则
multiset< Elem >:一个multiset,以less<>(operator<)为排序准则
multiset< Elem, Op >:一个multiset,以op为排序准则

  • 非变动性操作

c.size():返回容器的大小
c.empty():判断容器大小是否为令。等同于size()==0,但可能更快
c.max_size():返回可容纳的最大元素数量
c1 == c2:判断是否c1等于c2
c1 != c2:判断是否c1不等于c2。等同于!(c1==c2)
c1 < c2:判断是否c1小于c2
c1 > c2:判断是否c1大于c2。等同于c2 < c1
c1 <= c2:判断是否c1小于等于c2。等同于!(c2 < c1)
c2 <= c1:判断是否c1大于等于c2。等同于!(c1 < c2)

  • 搜寻操作

count(elem):返回“元素值为elem”的元素个数
find(elem):返回“元素值为elem”的第一个元素,如果找不到就返回end()
lower_bound(elem):返回elem的第一个可安插位置,也就是“元素值>=elem”的第一个元素位置
upper_bound(elem):返回elem的最后一个可安插位置,也就是“元素值>elem”的第一个元素位置
equal_range(elem):返回elem可安插的第一个位置和最后一个位置,即“元素值==elem”的元素区间

  • 赋值操作

c1 = c2:将c2中所有元素赋值给c1
c1.swap(c2):将c1和c2的元素互换
swap(c1, c2):将c1和c2的元素互换。此为全局函数

  • 迭代器相关操作

c.begin():返回一个双向迭代器(将元素视为常数),指向第一个元素
c.end():返回一个双向迭代器(将元素视为常数),指向最后元素的下一个位置
c.rbegin():返回一个逆向迭代器,指向逆向遍历时的第一个元素
c.rend():返回一个逆向迭代器,指向逆向遍历时的最后元素的下一个位置

  • 插入和删除操作

c.insert(elem):安插一份elem副本,返回新元素位置(不论是否成功——对sets而言)
c.insert(pos, elem):安插一份elem副本,返回新元素位置(pos是个提示,指出安插操作的搜寻起点。如果提示恰当,可大大加快速度)
c.insert(beg, end):将区间[begin; end]内所有元素的副本安插到c(无返回值)
c.erase(elem):移除“与elem相等”的所有元素,返回被移除的元素个数
c.erase(pos):移除迭代器pos所指位置上的元素,无返回值
c.erase(beg, end):移除区间[beg; end]内的所有元素,无返回值
c.clear():移除全部元素,将整个容器清空

  • 异常处理

sets和multisets是以节点为基础的容器。如果节点构造失败,容器仍保持原样。由于析构函数通常不抛出异常,所以节点的移除不可能失败。而对于多重元素安插操作,“保持元素次序”这一条件会造成“异常抛出时能够完全复原”这一需求变得不切实际。故只有“单一元素安插操作”才支持“成功,否则无效”的操作原则。至于“多元素删除操作”总是能够成功。如果排序准则之复制/赋值操作会抛出异常,则swap()也会抛出异常。

**参考文献:**STL源码分析,C++标准库

0 0
原创粉丝点击