C++ 多重集的使用
C++ 多重集的使用
多重集当中的数据映射关系将不是前面的一对一的关系,而是一对多,也就是可以在容器当中插入具有相同key的实例。关于组织方式,LZ进行了下面的大胆的预测。
第一、底层的数据组织方式如果是红黑树,那么就会将具有相同key的数据连续存放,也就是在红黑树的中序遍历中他们是挨着的。
第二、如果是使用hash函数,我猜测是使用了另外一种容器,将他们放到了一个链表当中,因为他们简直相同,无需对key进行排序,这里唯一有价值的是时间信息,因此使用链表足矣。
这里的多重集包括了multimap,multiset,unordered_multimap,unordered_multiset
具体的一些用法总结如下。
1、insert
insert操作和前面的map,set没有多大区别,只是这里允许插入相同的键值
2、delete
multimap<string,string> students; multimap.insert(make_pair("xiaoming","PKU")); multimap.insert(make_pair("xiaoming","THU")); multimap<string,string>::size_type cnt=students.erase("xiaoming");
上述代码返回删除的相同键值的元素的个数
3、查找
由于存在重复,因此需要应对重复的情形。同样以multimap为例
3.1传统的方法
typedef multimap<string,string>::size_type stype; stype num = m.count("key"); multimap<string,string>::iterator iter; iter=m.find("key"); for(int i=0;i<num;i++){ cout<<iter->second<<endl; iter++; }
3.2使用upper bound和lower bound
typedef multimap<string,string>::iterator iteratortype; iteratortype iterup=m.upper_bound("key"); iteratortype iterlow=m.lower_bound("key"); for(;iterup!=iterlow;iterup++){ cout<<iterup->second<<endl; }
3.3使用equal_range(key)
typedef multimap<string,string>::iterator iteratortype; pair<iteratortype,iteratortype> p=m.equal_range("key"); while(p.first != p.second){ cout<<p.first->second<<endl; p.first++; }
posted on 2015-06-09 16:48 lightblueme 阅读(992) 评论(0) 编辑 收藏 举报