STL关联容器

set, multiset, map, multimap 是一种非线性的树结构,具体的说采用的是一种
比较高效的特殊的平衡检索二叉树——红黑树结构。
因为关联容器的这四种容器类都使用同一原理,所以他们核心的算法是一致

的,但是它们在应用上又有一些差别,先描述一下它们之间的差别。

set 又称集合,实际上就是一组元素的集合,但其中所包含的元素的值是唯
一的,且是按一定顺序排列的,集合中的每个元素被称作集合中的实例。因为其
内部是通过链表的方式来组织,所以在插入的时候比vector 快,但在查找和末尾
添加上比vector 慢。
multiset 是多重集合,其实现方式和set 是相似的,只是它不要求集合中的
元素是唯一的,也就是说集合中的同一个元素可以出现多次。
map 提供一种“键- 值”关系的一对一的数据存储能力。其“键”在容器中
不可重复,且按一定顺序排列(其实我们可以将set 也看成是一种键- 值关系的
存储,只是它只有键没有值。它是map 的一种特殊形式)。由于其是按链表的方
式存储,它也继承了链表的优缺点。
multimap 和map 的原理基本相似,它允许“键”在容器中可以不唯一。
关联容器的特点是明显的,相对于顺序容器,有以下几个主要特点:
1、其内部实现是采用非线性的二叉树结构,具体的说是红黑树的结构原理
实现的;
2、set 和map 保证了元素的唯一性,mulset 和mulmap 扩展了这一属性,
可以允许元素不唯一;
3、元素是有序的集合,默认在插入的时候按升序排列。
基于以上特点,
1、关联容器对元素的插入和删除操作比vector 要快,因为vector 是顺序存
储,而关联容器是链式存储;比list 要慢,是因为即使它们同是链式结构,但list
是线性的,而关联容器是二叉树结构,其改变一个元素涉及到其它元素的变动比
list 要多,并且它是排序的,每次插入和删除都需要对元素重新排序;
2、关联容器对元素的检索操作比vector 慢,但是比list 要快很多。vector 是
顺序的连续存储,当然是比不上的,但相对链式的list 要快很多是因为list 是逐
个搜索,它搜索的时间是跟容器的大小成正比,而关联容器查找的复杂度基本
是Log(N) ,比如如果有1000 个记录,最多查找10 次,1,000,000 个记录,最多
查找20 次。容器越大,关联容器相对list 的优越性就越能体现;
3、在使用上set 区别于vector,deque,list 的最大特点就是set 是内部排序的,
这在查询上虽然逊色于vector ,但是却大大的强于list 。
4、在使用上map 的功能是不可取代的,它保存了“键- 值”关系的数据,
而这种键值关系采用了类数组的方式。数组是用数字类型的下标来索引元素的位
置,而map 是用字符型关键字来索引元素的位置。在使用上map 也提供了一种
类数组操作的方式,即它可以通过下标来检索数据,这是其他容器做不到的,当
然也包括set 。(STL 中只有vector 和map 可以通过类数组的方式操作元素,即
如同ele[1] 方式)

(1)Sets & MultiSets

集合(Set)是一种包含已排序对象的关联容器。多元集合(MultiSets)和集合
(Sets)相像,只不过支持重复对象,其用法与set基本相同。
1.begin() 返回指向第一个元素的迭代器
2.clear() 清除所有元素
3.count() 返回某个值元素的个数

4.empty() 如果集合为空,返回true
5.end() 返回指向最后一个元素的迭代器
6.equal_range() 返回第一个>=关键字的迭代器和>关键字的迭代器
语法:
pair <iterator,iterator>equal_range( const key_type &key );
//key是用于排序的关键字
Set<int> ctr;
例如:
Pair<set<int>::iterator,set<int>::iterarot>p;
For(i=0;i<=5;i++) ctr.insert(i);
P=ctr.equal_range(2);
那么*p.first==2;*p.second==3;
7.erase() 删除集合中的元素
语法:
iterator erase( iterator i ); //删除i位置元素
iterator erase( iterator start, iterator end );
//删除从start开始到end(end为第一个不被删除的值)结束的元素
size_type erase( const key_type &key );
//删除等于key值的所有元素(返回被删除的元素的个数)
//前两个返回第一个不被删除的双向定位器,不存在返回末尾
//第三个返回删除个数
8.find() 返回一个指向被查找到元素的迭代器
语法:
iterator find( const key_type &key );
//查找等于key值的元素,并返回指向该元素的迭代器;
//如果没有找到,返回指向集合最后一个元素的迭代器
9.get_allocator() 返回集合的分配器
10.insert() 在集合中插入元素
语法:
iterator insert( iterator i, const TYPE &val ); //在迭代器i前插入val
void insert( input_iterator start, input_iterator end );
//将迭代器start开始到end(end不被插入)结束返回内的元素插入到集合中
pair insert( const TYPE &val );
//插入val元素,返回指向该元素的迭代器和一个布尔值来说明val是否成功被插入
//应该注意的是在集合(Sets中不能插入两个相同的元素)
11.lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
语法:
iterator lower_bound( const key_type &key );
//返回一个指向大于或者等于key值的第一个元素的迭代器
12.key_comp() 返回一个用于元素间值比较的函数
语法:
key_compare key_comp();
//返回一个用于元素间值比较的函数对象
13.max_size() 返回集合能容纳的元素的最大限值

14.rbegin() 返回指向集合中最后一个元素的反向迭代器
示例:
Set<int> ctr;
Set<int>::reverse_iterator rcp;
For(rcp=ctr.rbegin();rcp!=ctr.rend();rcp++)
Cout<<*rcp<<” ”;
15.rend() 返回指向集合中第一个元素的反向迭代器
16.size() 集合中元素的数目
17.swap() 交换两个集合变量
语法:
void swap( set &object ); //交换当前集合和object集合中的元素
18.upper_bound() 返回大于某个值元素的迭代器
语法:
iterator upwer_bound( const key_type &key );
//返回一个指向大于key值的第一个元素的迭代器
19.value_comp() 返回一个用于比较元素间的值的函数
语法:
iterator upper_bound( const key_type &key );//返回一个用于比较元素间的值的函数对象


(2) Maps & MultiMaps
C++ Maps是一种关联式容器,包含“关键字/值”对。
C++ Multimaps和maps很相似,但是MultiMaps允许重复的元素。
1.begin() 返回指向map头部的迭代器
2.clear() 删除所有元素
3.count() 返回指定元素出现的次数
语法:
size_type count( const KEY_TYPE &key );
//返回map中键值等于key的元素的个数
4.empty() 如果map为空则返回true
5.end() 返回指向map末尾的迭代器
6.equal_range() 返回特殊条目的迭代器对
语法:
pair equal_range( const KEY_TYPE &key );
返回两个迭代器,指向第一个键值为key的元素和指向最后一个键值为key的元素
7.erase() 删除一个元素
语法:
void erase( iterator i ); //删除i元素
void erase( iterator start, iterator end ); //删除从start开始到end(不包括end)结束的元素
size_type erase( const key_type &key );
//删除等于key值的所有元素(返回被删除的元素的个数)
8.find() 查找一个元素
语法:
iterator find( const key_type &key );

//查找等于key值的元素,并返回指向该元素的迭代器;
//如果没有找到,返回指向集合最后一个元素的迭代器.
9.get_allocator() 返回map的配置器
10.insert() 插入元素
语法:
iterator insert( iterator pos, const pair<KEY_TYPE,VALUE_TYPE> &val );
//插入val到pos的后面,然后返回一个指向这个元素的迭代器
void insert( input_iterator start, input_iterator end );
//插入start到end的元素到map中
pair<iterator, bool> insert( const pair<KEY_TYPE,VALUE_TYPE> &val );
//只有在val不存在时插入val。返回指向被插入元素的迭代器和描述是否插入的bool11.key_comp() 返回比较元素key的函数
语法:
key_compare key_comp();
//返回一个用于元素间值比较的函数对象
12.lower_bound() 返回键值>=给定元素的第一个位置
语法:
iterator lower_bound( const key_type &key );
//返回一个指向大于或者等于key值的第一个元素的迭代器
13.max_size() 返回可以容纳的最大元素个数
14.rbegin() 返回一个指向map尾部的逆向迭代器
15.rend() 返回一个指向map头部的逆向迭代器
16.size() 返回map中元素的个数
17.swap() 交换两个map
语法:
void swap( map &obj );
//swap()交换obj和现map中的元素
18.upper_bound() 返回键值>给定元素的第一个位置
语法:
iterator upwer_bound( const key_type &key );
//返回一个指向大于key值的第一个元素的迭代器
19.value_comp() 返回比较元素value的函数
语法:
value_compare value_comp();
//返回一个用于比较元素value的函数


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值