C++ STL库中的multimap和unordered_multimap

首先,map和unordered_map中在插入时一个key只能对应一个value,map的底层实现是红黑树,且key顺序是有序的,unordered_map的底层实现是hash。
简单试一下map:

	map<int, int> oMp;
	oMp[1] = 112;
	oMp[3] = 2;
	oMp[2] = 22;
	oMp[5] = 12;
	oMp[2] = 11;
	for (auto e : oMp) {
     
		cout << "key: "<< e.first << "  value: "<<e.second << endl;
	}

输出为:
key: 1 value: 112
key: 2 value: 11
key: 3 value: 2
key: 5 value: 12
可见2的value已经改变,同时迭代输出的key是有序的。同样再来试一下unordered_map:

	unordered_map<int, int> oMp;
	oMp[1] = 112;
	oMp[3] = 2;
	oMp[2] = 22;
	oMp[5] = 12;
	oMp[2] = 11;
	for (auto e : oMp) {
     
		cout << "key: "<< e.first << "  value: "<<e.second << endl;
	}

输出为:
key: 1 value: 112
key: 3 value: 2
key: 2 value: 11
key: 5 value: 12
那么对于multimap和unordered_multimap:

C++的参考手册:http://www.cplusplus.com/reference/map/multimap/
multimap允许一键多值,具体可以去bi站搜一搜侯捷老师将的STL,多重映射是一种关联容器,存储键值和映射值按特定顺序组合而成的元素,其中多个元素可以具有等效键。在一个多重映射中,键值通常用于排序和唯一地标识元素,而映射的值存储与此键关联的内容。键和映射值的类型可能不同,并在成员类型value_type中组合在一起,这是将两者组合在一起的成对类型:

typedef pair value_type;
要求key是可以比较的。
multimap具有以下性质:

  • 以rb_tree为底层结构,因此元素有自动排序的特性,排序的依据是key;
  • 提供遍历操作和迭代器,正常的++ite遍历,便能得到排序状态;
  • 无法使用map/multimap来改变元素的key,但可以用来改变元素的data。
  • map元素的key必须独一无二,因此insert()使用的是rb_tree的insert_unique();
  • multimap元素的key可以重复,因此inset()使用的是rb_tree的insert_equal().
    C++ STL库中的multimap和unordered_multimap_第1张图片
	multimap<int, int> oMp;
	oMp.insert(make_pair(1, 2));
	oMp.insert(make_pair(1, 31));
	oMp.insert(make_pair(1, 14));
	oMp.insert(make_pair(1, 51));
	oMp.insert(make_pair(12, 123));
	oMp.insert(make_pair(12, 11));
	oMp.insert(make_pair(2, 293));
	oMp.insert(make_pair(12, 1123));
	oMp.insert(make_pair(2, 101));
	oMp.insert(make_pair(2, 203));
	for (auto e : oMp) {
     
		cout << "key: "<< e.first << "  value: "<<e.second << endl;
	}

输出为:

key: 1 value: 2
key: 1 value: 31
key: 1 value: 14
key: 1 value: 51
key: 2 value: 293
key: 2 value: 101
key: 2 value: 203
key: 12 value: 123
key: 12 value: 11
key: 12 value: 1123

multimap的成员函数有:
C++ STL库中的multimap和unordered_multimap_第2张图片
如果找到具有指定键的元素,则对元素进行迭代,否则为multimap::end。
如果multimap对象是const类型的,该函数将返回一个const_iterator。否则,它返回一个迭代器。
成员类型iterator和const_iterator是指向元素(类型为value_type)的双向迭代器类型。注意,multimap中的value_type是pair的别名。
那么如何查找multimap中指定key的所有value呢?
主要可以用到multimap的两个成员函数equal_range和count:

	auto its = oMp.equal_range(1);
	for (auto it = its.first; it != its.second; ++it) {
     
		cout << it->second << endl;
	}

再来看看count();

	int len = oMp.count(1);
	auto it = oMp.find(1);
	while(len--)
	{
     
		cout << it->second << endl;
		++it;
	}

lowerbound和upperbound:

#include 
#include 

int main ()
{
     
  std::multimap<char,int> mymultimap;
  std::multimap<char,int>::iterator it,itlow,itup;

  mymultimap.insert(std::make_pair('a',10));
  mymultimap.insert(std::make_pair('b',121));
  mymultimap.insert(std::make_pair('c',1001));
  mymultimap.insert(std::make_pair('c',2002));
  mymultimap.insert(std::make_pair('d',11011));
  mymultimap.insert(std::make_pair('e',44));

  itlow = mymultimap.lower_bound ('b');  // itlow points to b
  itup = mymultimap.upper_bound ('d');   // itup points to e (not d)

  // print range [itlow,itup):
  for (it=itlow; it!=itup; ++it)
    std::cout << (*it).first << " => " << (*it).second << '\n';

  return 0;
}

b => 121
c => 1001
c => 2002
d => 11011

** 值得注意的是multimap不支持[]操作符**

unordered_multimap与multimap的区别与map和unordered_map的区别比较类似。同样数据是无序和有序的区别。但保证数据的顺序是有代价的,这也使得map和multimap的查找复杂度为O(log n), 而基于hash实现的方式为O(1).
unordered_multimap的成员函数有:
C++ STL库中的multimap和unordered_multimap_第3张图片

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