首先,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
要求key是可以比较的。
multimap具有以下性质:
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的成员函数有:
如果找到具有指定键的元素,则对元素进行迭代,否则为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的成员函数有: