目录
1.包含<map>头文件
#include<map>
2.map的创建与初始化
- map<T keyType, T valueType> m:创建一个键为 keyType 类型,值为 valueType 类型的空 map
- map<T keyType, T valueType> m {pair_1, pair_2, ..., pair_i}:创建并使用 i 个 pair 初始化 map,pair 类型与 map 一致
- map<T keyType, T valueType> m {another_map}:拷贝一个 map,类型要一致
- map<T keyType, T valueType> m {begin, end}:使用一个类型一致的 map 的迭代器创建并初始化 map
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
map<string, int> nameToAge; // 创建一个空的 map
pair<string, int> info1 = make_pair("fujh", 20);
pair<string, int> info2 = make_pair("fujy", 19);
map<string, int> nameToAge1 {info1, info2}; // 使用 pair 初始化 map
// 也可以直接以如下方式使用,效果同上
map<string, int> nameToAge2 {make_pair("fujh", 20), make_pair("fujy", 19)};
map<string, int> nameToAge3 {{"fujh", 20}, {"fujy", 19}};
// 拷贝 map
map<string, int> nameToAge4 = nameToAge2;
map<string, int> nameToAge5 {nameToAge2};
// 使用迭代器初始化
map<string, int> nameToAge6 {nameToAge3.begin(), nameToAge3.end()};
return 0;
}
3.元素访问
- [ ] 下标访问
- at() 函数访问
两者的区别为:[ ] 访问不存在元素不会报错,访问仍然成功,取得value对象默认构造的值;而at() 会产生错误,阻止该访问
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
map<string, int> nameToAge {{"fujh", 20}, {"fujy", 19}};
cout << nameToAge["fujh"] << endl; // 20
cout << nameToAge.at("fujy") << endl; // 19
return 0;
}
4.插入与删除
- insert():插入元素,不能插入与原有的键一样的值
- emplace():构造并插入元素,不能插入与原有的键一样的值
- erase():删除元素
- clear():清空
#include<iostream>
#include<map>
#include<string>
using namespace std;
void showMap(const map<string, int> &m)
{
for(pair<string, int> p : m)
{
cout << "name: " << p.first << '\t';
cout << "age: " << p.second << endl;
}
}
int main()
{
map<string, int> nameToAge {{"fujh", 20}, {"fujy", 19}};
showMap(nameToAge);
/*name: fujh age: 20
*name: fujy age: 19
*/
map<string, int> name2age {{"aaaa", 11}, {"bbbb", 12}};
// insert 插入一个元素
nameToAge.insert({"cccc", 13}); // 也可以如下
// nameToAge.insert(make_pair("cccc", 13)) // 插入一个 pair
// pair<string, int> p = make_pair("cccc", 13);
// nameToAge.insert(p); // 插入一个 pair
showMap(nameToAge);
/*name: cccc age: 13
*name: fujh age: 20
*name: fujy age: 19
*/
// insert 使用迭代器插入多个
nameToAge.insert(name2age.begin(), name2age.end());
// 同 nameToAge.insert({"aaaa", 11}, {"bbbb", 12})
showMap(nameToAge);
/*name: aaaa age: 11
*name: bbbb age: 12
*name: cccc age: 13
*name: fujh age: 20
*name: fujy age: 19
*/
// emplace 插入
nameToAge.emplace("dddd", 14);
showMap(nameToAge);
/*name: aaaa age: 11
*name: bbbb age: 12
*name: cccc age: 13
*name: dddd age: 14
*name: fujh age: 20
*name: fujy age: 19
*/
// erase 删除
nameToAge.erase("dddd"); // 返回值为删除的数目,因为 key 唯一,故返回值为 0/1
showMap(nameToAge);
/*name: aaaa age: 11
*name: bbbb age: 12
*name: cccc age: 13
*name: fujh age: 20
*name: fujy age: 19
*/
// erase 迭代器删除
nameToAge.erase(begin(nameToAge)); // 返回下一个元素的迭代器
showMap(nameToAge);
/*name: bbbb age: 12
*name: cccc age: 13
*name: fujh age: 20
*name: fujy age: 19
*/
// erase 迭代器删除多个元素,左闭右开式删除
auto iter = begin(nameToAge);
advance(iter, 2); // iter 前移 2 次
nameToAge.erase(begin(nameToAge), iter);
showMap(nameToAge);
/*name: fujh age: 20
*name: fujy age: 19
*/
// 清空 map
nameToAge.clear();
cout << nameToAge.size() << endl; // 0
cout << (nameToAge.empty() ? "true" : "false") << endl; // true
return 0;
}
这里只记录了 map 的简单使用,对于 map 的更加详细的方面,如:底层组织等没有记录。
了解更多请参考:C++ map容器(STL map容器)