- map 是关联容器的一种, 其每个元素分为 关键字 和 该关键字的值 两部分
- map 容器中关键字唯一, 且按关键字排序
常见接口 | 接口作用 |
---|---|
begin() | 返回指向 map 头部的迭代器 |
end() | 返回指向 map 末尾的迭代器, 最后一个元素的下一个 |
count() | 返回指定元素出现的 次数 |
size() | 返回map中元素的 个数 |
max_size() | 返回可以容纳的 最大元素个数 |
insert() | 插入元素 |
find() | 查找一个元素, 返回一个迭代器 |
equal_range | 返回两个迭代器,第一个表示 <= 查找元素 的迭代器位置,第二个是 >它 的迭代器位置 |
empty() | 如果 map 为空则返回 true |
erase() | 删除一个元素 |
clear() | 删除所有元素 |
swap() | 交换两个 map |
#include <iostream>
#include <map>
using namespace std;
int main() {
map<int, string> myMap;
// 三种插入方式
// 1. [] 直接插入
myMap[1] = "Aaaaaaa";
// 如果再有
myMap[1] = "Aaaa";
// 则会覆盖掉前面的"Aaaa", 因为 map 关键字的唯一性
// 当然, 如果关键字为 1 的元素不存在, 就会新建并且插入 map
// 2. 利用 insert 函数
// (1)通过 pair<int, string>(2, ”Bbbb“) 构造 pair 元素
myMap.insert(pair<int, string>(2, "Bbbb"));
// (2)通过 make_pair 构造 pair 元素
myMap.insert(make_pair(3, "Cccc"));
// (3)通过 value_type 构造 pair 元素
myMap.insert(map<int, string>::value_type(4, "Dddd"));
// 用 insert 重复插入 则不成功
pair<map<int, string>::iterator, bool> ptr = myMap.insert(make_pair(1, "Aaaaaaa"));
if(ptr.second) {
cout << "插入成功" << endl;
} else {
cout << "插入不成功" << endl;
}
// 元素的删除
// 删除 值为 "Dddd" 的元素
for(map<int, string>::iterator ptr = myMap.begin(); ptr != myMap.end(); ptr++) {
if(ptr->second.compare("Dddd") == 0) {
myMap.erase(ptr);
cout << "删除成功" << endl;
}
}
myMap[5] = "Eeee";
// 统计 Eeee 出现的次数
cout << myMap.count(11) << endl;
// 查找 key = 4 的键值对
map<int, string>::iterator pt = myMap.find(4);
if(pt != myMap.end()) {
cout << "存在 key 值为 4 的键值对" << endl;
} else {
cout << "不存在 key 值为 4 的键值对" << endl;
}
// 查找 key = 4 的键值对的位置
// 返回两个迭代器,第一个表示 <=4 的迭代器位置,第二个是 >4 的迭代器位置
pair<map<int, string>::iterator, map<int, string>::iterator> myPair = myMap.equal_range(4);
if(myPair.first == myMap.end()) {
cout << "小于等于 4 的位置不存在" << endl;
} else {
cout << myPair.first->first << " " << myPair.first->second << endl;
}
if(myPair.second == myMap.end()) {
cout << "大于 4 的位置不存在" << endl;
} else {
cout << myPair.second->first << " " << myPair.second->second << endl;
}
// 遍历 map
for(auto ptr: myMap) {
cout << ptr.first << " " << ptr.second << endl;
}
// 清除 map
myMap.clear();
// map 是否为空
cout << "map 是否为空: " << myMap.empty() << endl;
return 0;
}
注意: map 和 multimap 十分类似,区别在于 map 容器中元素的关键字不能重复。而 multimap 可以, multimap 有的成员函数,map 都有。此外,map 还有成员函数 operator[ ]:T & operator[ ] (Key k);
该成员函数返回 first 值为 k 的元素的 second 部分的引用。如果容器中没有元素的 first 值等于 k,则自动添加一个 first 值为 k 的元素。如果该元素的 second 成员变量是一个对象,则用无参构造函数对其初始化。