lightblueme

许多问题需要说清楚就可以&&走永远比跑来的重要

导航

C++ 多重集的使用

C++ 多重集的使用

多重集当中的数据映射关系将不是前面的一对一的关系,而是一对多,也就是可以在容器当中插入具有相同key的实例。关于组织方式,LZ进行了下面的大胆的预测。

第一、底层的数据组织方式如果是红黑树,那么就会将具有相同key的数据连续存放,也就是在红黑树的中序遍历中他们是挨着的。

第二、如果是使用hash函数,我猜测是使用了另外一种容器,将他们放到了一个链表当中,因为他们简直相同,无需对key进行排序,这里唯一有价值的是时间信息,因此使用链表足矣。

这里的多重集包括了multimapmultisetunordered_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编辑  收藏  举报