文章目录
- Map、HashMap概念
- map、hashmap 的区别
- 引用头文件
- 初始化赋值
- map 自定义 key 类型
- map 的 value 自定义数据类型
- 遍历
- 常用方法
- 插入
- 查找 key
- 修改 value
- 删除元素
- 清空元素
map
中每一个元素都是一个 key-value
对,数据类型为 pair
std::pair
主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。
pair
实质上是一个结构体,其主要的两个成员变量是 first
和 second
,这两个变量可以直接使用。
初始化一个 pair
可以使用构造函数,也可以使用 std::make_pair
函数,make_pair
函数的定义如下:
template pair make_pair(T1 a, T2 b) { return pair(a, b); }
一般 make_pair
都使用在需要 pair
做参数的位置,可以直接调用 make_pair
生成 pair
对象。
pair<string, int> student ("zhangsan", 17); // name-age
student.first = "zhangsan";
student.second = 17; product3 = make_pair ("shoes",20.0);
Map、HashMap概念
Map
是STL
的一个关联容器,以键值对存储的数据,其类型可以自己定义,每个关键字在map
中只能出现一次,关键字不能修改。map
也可以说关于key-value
的映射。HashMap
是基于哈希表实现的,每一个元素是一个key-value
对。以空间换时间,是存储key-value
键值对的集合。
map、hashmap 的区别
hash_map
底层采用hash
表存储,map
一般采用红黑树实现,所以hash_map
的key
值是无序的,map
存储是有有序的。map
的优点在于可以自动按照Key
值进行排序,查找时间复杂度是log(n)
;hash_map
优点在于它各项操作的平均时间复杂度接近常数,即O(1).
引用头文件
#include <map>
初始化赋值
- 使用初始化列表初始化map,并添加若干键值对
std::map<KeyType, ValueType> myMap = {{key1, value1},{key2, value2},// more key-value pairs
};
- 使用插入操作逐个添加元素到map中
std::map<KeyType, ValueType> myMap;
myMap.insert(std::make_pair(key1, value1));
myMap.insert(std::make_pair(key2, value2));
// more insertions
map 自定义 key 类型
如果要将自定义类型作为 map
的键值,将 less<key>
模板类示例化,重载 operator()
函数
另外,可以根据 less 自定义 对 key 值进行特定排序
参考:https://blog.csdn.net/qq525003138/article/details/121306663
#include <iostream>
#include <string>
#include <map>
using namespace std;struct student{student(string str, int a) : name(str), age(a) {};bool operator==(const student& stu2) const {return stu2.name == name && stu2.age == age;}string name;int age;
};struct CompareClass {
public:// 函数const限定修饰符一定不要丢,必须和less<Key> 模板类保持一致bool operator()(const student& key1, const student& key2) const {return key1.name == key2.name && key1.age == key2.age;}
};int main() {struct student stu1 = {"zhangsan", 17};map<student, string, CompareClass> students = {make_pair(stu1, "13班")};for(auto x : students) {cout<< x.first.name << " " << x.first.age << "岁 " << x.second << endl;}return 0;
}
map 的 value 自定义数据类型
unordered_map 的 value 自定义数据类型时,无特殊操作,按照常见数据类型操作即可
#include <iostream>
#include <string>
#include <map>
using namespace std;struct student{student(string str, int a) : name(str), age(a) {};bool operator==(const student& stu2) const {return stu2.name == name && stu2.age == age;}string name;int age;
};struct CompareClass {
public:// 函数const限定修饰符一定不要丢,必须和less<Key> 模板类保持一致bool operator()(const student& key1, const student& key2) const {return key1.name == key2.name && key1.age == key2.age;}
};int main() {struct student stu1 = {"zhangsan", 17};map<string, student> students = {make_pair("13班", stu1)};for(auto x : students) {cout<< x.first << " " << x.second.name << " " << x.second.age << "岁 " << endl;}return 0;
}
遍历
- 迭代器遍历
for ( auto it = name_Address.begin(); it != name_Address.end(); ++it )cout << " " << it->first << ":" << it->second;
- range for循环遍历
for ( auto x : name_Address )cout << " " << x.first << ":" << x.second;
常用方法
插入
- 构造时插入 pari 类型
pair<string, int> student ("zhangsan", 17);
student.insert (student1);
student.insert (make_pair<string, int>("lisi", 18));
- 构造时插入 数组 类型
// 初始化数组插入(可以用二维一次插入多个元素,也可以用一维插入一个元素)
student.insert ({{"zhangsan", 17}, {"lisi", 18}});
- 数组形式插入
//数组形式插入
myrecipe["coffee"] = 10.0;
查找 key
map<string, int>::iterator get = student.find ("zhangsan");if ( get == student.end() )cout << "not found";
elsecout << "found "<<get->first << " is " << get->second<<"\n\n";
修改 value
student.at("zhangsan") = 18;
student["zhangsan"] = 17;
删除元素
// 1. 通过位置
student.erase(myrecipe.begin());// 2. 通过key
student.erase("milk");
清空元素
student.clear();