c++ multimap multiset

相信对熟悉C++的朋友来说,map、set这两种关联容器都不会陌生。但是对multimap和multiset呢?估计很多人就比较模棱两可了。

虽然同样是基于RB-tree的底层实现,multimap、multiset与map、set还是有点不一样的。

multimap允许一键(key)对应多值(value),而multiset则允许键的重复,它也可以看做是以键和对应键的数量(count)为值的

multimap。

这么说可能会有些抽象,让我们们来举几个例子吧:

multimap:

(1)把各地的邮政编码作为key,可以把生活在key对应地方的人们作为value;

(2)把词典里的词最为key,每个词的解释作为value(一个词可能有多种解释);

multiset:

(1)杂货店里的各种货物作为key,各种货物的剩余数量作为count;

(2)商店的销售记录中,售出货物的名称为key,已售出的对应货物的数量作为count;


对multimap和multiset的操作与对map和set的操作基本类似,唯一要注意的就是multimap允许一键多值,所以不允许对multimap进行下

标操作(系统会不知道返回哪个值的)。


使用带有一个键参数的erase函数时,删除该键所对应的所有元素,返回元素的个数。

multimap提供的操作列出如下:
begin() 返回指向第一个元素的迭代器 
clear() 删除所有元素 
count() 返回一个元素出现的次数 
empty() 如果multimap为空则返回真 
end() 返回一个指向multimap末尾的迭代器 
equal_range() 返回指向元素的key为指定值的迭代器对 
erase() 删除元素 
find() 查找元素 
get_allocator() 返回multimap的配置器 
insert() 插入元素 
key_comp() 返回比较key的函数 
lower_bound() 返回键值>=给定元素的第一个位置 
max_size() 返回可以容纳的最大元素个数 
rbegin() 返回一个指向mulitmap尾部的逆向迭代器 
rend() 返回一个指向multimap头部的逆向迭代器 
size() 返回multimap中元素的个数 
swap() 交换两个multimaps 
upper_bound() 返回键值>给定元素的第一个位置 
value_comp() 返回比较元素value的函数


m.lower_bound(k):返回一个迭代器,指向键值不小于k的第一个元素
m.upper_bound(k):返回一个迭代器,指向键值不大于k的第一个元素
m.equal_range(k):返回一个迭代器的pair对象,它的first成员等价于m.lower_bound(k),second成员等价于m.upper_bound(k)。

这三个函数主要用来处理每个键所对应的所有值,因为lower_bound和upper_bound构成一个范围,分别指向k对应的第一个元素,和k对应的

后一个元素的下一个位置。

下面举个例子,例子来自http://blog.csdn.net/RO_wsy/article/details/7698077。该例子功能是找到每个作者对应的书名并输出,这个例子

将通过三种方式实现,以便读者可以比较一下lower_bound(),upper_bound()和equal_range()三个函数的用法和好处。

[cpp] view plaincopy
  1. #include   
  2. #include   
  3. #include   
  4. #include   
  5. using namespace std;  
  6.   
  7. int main()  
  8. {  
  9.     //定义作者名数组  
  10.     string authors[] = {"Stanley B.Lippman""Scott Meyers"};  
  11.     //定义作者名-书名multimap  
  12.     multimap auth_books;  
  13.   
  14.     //向auth_books中插入信息  
  15.     auth_books.insert(make_pair(authors[0], string("c++ primer")));  
  16.     auth_books.insert(make_pair(authors[0], string("essential c++")));  
  17.     auth_books.insert(make_pair(authors[1], string("effective c++")));  
  18.     auth_books.insert(make_pair(authors[1], string("more effective c++")));  
  19.     auth_books.insert(make_pair(authors[1], string("effective stl")));  
  20.       
  21.     /****************************************************/  
  22.     //第一种方式,使用find和count查找作者对应的书名信息并输出  
  23.     cout << "========================" << endl;  
  24.     typedef multimap::size_type sz_type;  
  25.     sz_type num = auth_books.count(authors[0]);  
  26.     multimap::iterator it = auth_books.find(authors[0]);  
  27.   
  28.     //因为在multimap和multiset中具有相同键的元素相邻存放,所以可通过迭代器依次访问  
  29.     //输出查找结果  
  30.     for (sz_type cnt = 0; cnt != num; ++cnt, ++it)  
  31.         cout << it->second << endl;  
  32.     cout << "========================" << endl;  
  33.   
  34.     /***************************************************/  
  35.     //第二种方式,lower_bound和upper_bound  
  36.     typedef multimap::iterator auth_it;  
  37.     auth_it beg = auth_books.lower_bound(authors[1]);  
  38.     auth_it end = auth_books.upper_bound(authors[1]);  
  39.     while (beg != end){  
  40.         cout << beg->second << endl;  
  41.         ++beg;  
  42.     }  
  43.     cout << "========================" << endl;  
  44.   
  45.     /***************************************************/  
  46.     //第三种方式,equal_range  
  47.     pair pos = auth_books.equal_range(authors[0]);  
  48.     while (pos.first != pos.second){//pos.first等价于lower_bound(),pos.second等价于upper_bound()  
  49.         cout << pos.first->second << endl;  
  50.         ++pos.first;  
  51.     }  
  52.     cout << "========================" << endl;  
  53.   
  54.     return 0;  
  55. }  
  56.   

运行结果如图:


你可能感兴趣的:(c++ multimap multiset)