关联性容器

关联性容器(有序)

关联性容器可以实现快速查找(O(logn))的容器

线性容器中array、vector、list、deque都可以使用全局find进行顺序查找(O(n)),必须支持operator==比较

底层实现 红黑树

一、set 集合容器

#include <set>
1、底层实现

集合容器,底层采用红黑树实现

特点:元素不能重复,会自动对数据进行排序,它存储的元素必须支持 < 运算符,只能使用迭代器遍历

默认下是按照 operator< 运算符进行比较

为什么不是使用 operator== 来比较

①二叉排序树的规则:左小于根、根小于右,如果相等会插入失败,==无法判断大小

②a==b 实际可以使用 !(a<b || b<a) 替代

2、构造函数

只有无参、拷贝构造

3、支持的运算符

与list一致,不支持随机访问

4、常见成员函数
insert
iterator insert(iterator i, const TYPE& val);

功能:向set中添加val,i位置意义不大

void insert(input_iterator start, input_iterator end);

功能:向set中添加一组[start, end)数据

pair<iterator,bool> insert(const TYPE& val);

功能:向set中添加val

返回值:返回键值对pair<添加的位置,是否添加成功>

count
size_type count(const key_type& key);

功能:查看key在set中有几个,要么0要么1

find
iterator find(const key_type& key);

功能:查找set中key的元素的位置,并返回该位置的迭代器

如果找不到key,返回end()位置迭代器

equal_range
pair<iterator, iterator> equal_range(const key_type& key);

功能:查看key在set中的范围,并返回该范围组成的键值对,在set中意义不大

erase
void erase(iterator pos );
void erase(iterator start, iterator end);
size_type erase(const key_type& key);

功能:删除值为key的元素,成功返回1,失败返回0

key_comp
key_compare key_comp() const;

功能:返回一个用于比较set中元素的函数对象,该对象属于set

set<int>::key_compare cmp = s.key_comp();
cmp(int, int)	//	第一个“小”,则为真

注意:在set中value_comp等同于key_comp

lower_bound
iterator lower_bound(const key_type& key);

功能:返回一个大于或等于key的最小的元素的迭代器

upper_bound
iterator upper_bound(const key_type& key);

功能:返回一个大于key的最小的元素的迭代器

二、multiset 多重集合容器

#include <set>

元素可以重复,也会对元素自动进行排序,元素必须支持<运算符,只能用迭代器遍历

size_type count(const key_type& key);

功能:计算有几个key

pair<iterator, iterator> equal_range(const key_type& key);

功能:放回值为key的元素的范围

三、map 映射容器

#include <map>

有序键值对容器,是由key/value组成的元素(键值对、字典)pair,要求key不能重复,一个key只能对应一个值,会根据key进行排序,因此key必须支持 < 运算符

一般map中存储一些经常需要查找的数据,因为map的查找速度极快,set速度也不慢,但是map比set多一个value来描述,redis内存数据库中使用了键值对存储数据

key和value一一对应,可以根据key来访问value,底层采用红黑树根据key来进行组织、管理,查找效率很高

1、构造函数
map(iterator start, iterator end);

功能:使用一组数据(pair类型)构造

map(iterator start, iterator end, const key_compare& cmp);

功能:使用一组数据(pair类型构造),并提供key的比较函数

map(const key_compare& cmp);

功能:提供key的比较函数构造

2、支持的运算符[]

[] 支持通过key作为下标访问元素的value

既可以用于访问,当key不存在时,也可以用于插入数据<key,val>,如果key存在,则修改value

m[key] = value	//	添加、修改
m[key];	//	key不存在,添加key-value value使用无参构造或者默认值0
m[key];	//	key存在,访问对应的value

成员函数 at(key) 也可以用于访问、修改key的value,但是当key不存在时会抛出异常out_of_range

3、成员函数
iterator insert(iterator i, const TYPE& pair);
void insert(input_iterator start, input_iterator end);
pair<iterator,bool> insert(const TYPE& pair);

四、multimap 多重映射

#include <map>

使用方式与map几乎类似

不同的是它的key可以对应多个不同的value,因此不能支持[]运算符

一些成员函数:count、equal_range 就变得有意义

五、bitset 位集合容器

#include <bitset>

是一种封装了各种位操作的类类型数据结构

!=, ==, &=, ^=, |=, ~, <<=, >>=, []

成员函数功能
any有任意一位是1,返回真
count统计二进制位是1的位数有几位
flip所有二进制位取反\指定的二进制位取反
none全部位没有一个是1,返回真
reset全部二进制位置0\指定二进制位置0
set全部二进制位置1\指定二进制位置val=1
size获取位数
test访问指定的二进制位的值
to_string把所有二进制位转string类型
to_ulong把所有二进制位转unsigned long类型

C++不常用,但是对于嵌入式软件编程会比较方便去设置二进制位

六、通过迭代器删除元素需要注意的问题

①对于关联性容器(set、multiset、map、multimap),删除当前iterator会仅仅使得当前iterator失效,其余位置没有变化,因此在erase时只需要递增iterator即可依次删除,因为底层是红黑树,某个节点删除不会影响其他节点位置

map.erase(it++);

②对于线性容器(vector、deque、stack、queue、priority_queue),删除当前iterator后,后序所有的iterator失去原来意义,因为使用的是连续内存,删除一个,后面所有元素都重新移动,iterator不能递增删除,只能通过重新接收erase的返回值,获取新的当前iterator继续删除

it = vector.erase(it);

③list 两种方式都可以

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值