三 关联式容器(一)set和multiset

本文详细介绍了C++ STL中的set与multiset容器的特性、使用方法及操作,包括生成、复制、销毁、查找、插入与删除等核心功能。特别关注了set与multiset的区别,如允许键重复的特性,以及特殊的查找函数优化。

一 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成员表示安插是否成功。



















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值