摘要:本文主要介绍了map容器和multimap容器的相关内容。
1、基本概念
1.1 Map的特性
所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。
1.1 map容器的键值无法修改
map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那么是可以的。
Map和list拥有相同的某些性质,当对它的容器元素进行新增操作或者删除操作时,操作之前的所有迭代器,在操作完成之后依然有效,当然被删除的那个元素的迭代器必然是个例外。
1.2 Multimap容器
Multimap和map的操作类似,唯一区别multimap键值可重复。
Map和multimap都是以红黑树为底层实现机制。
2、常用的API
API | 意义 | |
构造函数 |
map<T1, T2> mapTT |
map默认构造函数 |
map(const map &mp) | 拷贝构造函数 | |
赋值操作 |
map& operator=(const map &mp) |
重载等号操作符 |
swap(mp) | 交换两个集合容器 | |
大小操作 |
size() |
返回容器中元素的数目 |
empty() | 判断容器是否为空 | |
插入数据元素操作 |
map.insert(...); //往容器插入元素,返回pair<iterator,bool> map<int, string> mapStu; |
往容器插入元素,返回pair<iterator,bool> map<int, string> mapStu; |
第一种 通过pair的方式插入对象 |
mapStu.insert(pair<int, string>(3, "小张")); | |
第二种 通过pair的方式插入对象 |
mapStu.inset(make_pair(-1, "校长")) | |
第三种 通过value_type的方式插入对象 | mapStu.insert(map<int, string>::value_type(1, "小李")) | |
第四种 通过数组的方式插入值 |
mapStu[3] = "小刘";mapStu[5] = "小王"; |
|
删除操作
|
clear() |
删除所有元素 |
erase(pos) | 删除pos迭代器所指的元素,返回下一个元素的迭代器 | |
erase(beg,end) | 删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器 | |
erase(keyElem) | 删除容器中key为keyElem的对组 | |
查找操作 |
find(key) |
查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end() |
count(keyElem) |
返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap 来说,值可能大于1 |
|
lower_bound(keyElem) | 返回第一个key>=keyElem元素的迭代器 | |
upper_bound(keyElem) | 返回第一个key>keyElem元素的迭代器 | |
equal_range(keyElem) | 返回容器中key与keyElem相等的上下限的两个迭代器 |
3、代码示例
1 #include <iostream> 2 #include<map> 3 #include <algorithm> 4 5 using namespace std; 6 7 void test01() { 8 map<int, int>m; //注意和其他容器相区分,一个是序号另外一个是键值 9 m.insert(pair<int,int>(1,10)); //这里运用四种方法给map容器插值 10 m.insert(make_pair(2,20)); 11 m.insert(map<int,int>::value_type(3,30)); 12 m[4] = 40; 13 14 for (map<int,int>::iterator it=m.begin();it!=m.end();it++) 15 { 16 cout << it->first << " " << (*it).second << endl; 17 } 18 19 if(m.empty()) 20 { 21 cout << "空" << endl; 22 } 23 else 24 { 25 cout << "size = " << m.size() << endl; 26 } 27 } 28 29 void test02() { 30 map<int, int> m; 31 m.insert(pair<int, int>(1, 10)); 32 m.insert(make_pair(2, 20)); 33 m.insert(map<int, int>::value_type(3, 30)); 34 m[4] = 40; 35 36 m.erase(1); //直接将第一个值删除 37 for (map<int, int>::iterator it = m.begin(); it != m.end(); it++) 38 { 39 cout << "key = " << it->first << " value" << it->second << endl; 40 } 41 42 map<int, int>::iterator pos = m.find(2); //查找 43 if (pos != m.end()) 44 { 45 cout << "找到:key" << pos->first << " value:" << pos->second << endl; 46 } 47 else 48 { 49 cout << "未找到" << endl; 50 } 51 52 int num = m.count(3); //map的count 要么0 要么1 53 cout << "num = " << num << endl; 54 55 // lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。 56 57 map<int, int>::iterator ret = m.lower_bound(3); 58 if (ret != m.end()) 59 { 60 cout << "lower_bound 中key" << ret->first << " value: " << ret->second << endl; 61 } 62 else 63 { 64 cout << "未找到" << endl; 65 } 66 67 //upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。 68 ret = m.upper_bound(3); 69 if (ret != m.end()) 70 { 71 cout << "upper_bound 中key" << ret->first << " value: " << ret->second << endl; 72 } 73 else 74 { 75 cout << "未找到" << endl; 76 } 77 78 //equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。 79 80 pair<map<int, int>::iterator, map<int, int>::iterator> ret2 = m.equal_range(3); 81 82 if (ret2.first != m.end()) 83 { 84 cout << "找到了equal_range 中的lower_bound 的key " << ret2.first->first << " value: " << ret2.first->second << endl; 85 } 86 else 87 { 88 cout << "未找到" << endl; 89 } 90 91 if (ret2.second != m.end()) 92 { 93 cout << "找到了equal_range 中的upper_bound 的key " << ret2.second->first << " value: " << ret2.second->second << endl; 94 } 95 else 96 { 97 cout << "未找到" << endl; 98 } 99 } 100 bool myCompare(int &v1, int &v2){ 101 return v1 > v2; 102 } 103 104 int main() { 105 //test01(); 106 test02(); 107 system("pause"); 108 return 0; 109 }