map hashmap
unordered_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
是 STL
的一个关联容器,以键值对存储的数据,其类型可以自己定义,每个关键字在 map
中只能出现一次,关键字不能修改。map
也可以说关于 key-value
的映射。HashMap
是基于哈希表实现的,每一个元素是一个 key-value
对。以空间换时间,是存储 key-value
键值对的集合。hash_map
底层采用 hash
表存储,map
一般采用红黑树实现,所以 hash_map
的 key
值是无序的,map
存储是有有序的。map
的优点在于可以自动按照 Key
值进行排序,查找时间复杂度是log(n)
;hash_map
优点在于它各项操作的平均时间复杂度接近常数,即O(1).#include
unordered_map<string,string> name_Address =
{
{"张三","beijing"},
{"李四","shanghai"},
{"王五","shenzhen"},
};
如果要将自定义类型作为unordered_map的键值,需如下两个步骤:
注意:
const
int
参考:https://blog.csdn.net/qq_43450920/article/details/127078664
#include
#include
#include
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;
};
// 定义哈希函数的函数对象
template<class T>
struct Hash {
size_t operator()(const T& key) const{
return key.age;
}
};
// 定义等比函数的函数对象
template<class T>
struct MyEqual {
bool operator()(const T& key1, const T& key2) const {
return key1.name == key2.name && key1.age == key2.age;
}
};
int main() {
struct student stu1 = {"zhangsan", 17};
unordered_map<student, string, Hash<student>> students = {make_pair(stu1, "13班")};
for(auto x : students) {
cout<< x.first.name << " " << x.first.age << "岁 " << x.second << endl;
}
return 0;
}
unordered_map 的 value 自定义数据类型时,无特殊操作,按照常见数据类型操作即可
#include
#include
#include
using namespace std;
struct student{
string name;
int age;
};
int main() {
struct student stu1 = {"zhangsan", 17};
unordered_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;
for ( auto x : name_Address )
cout << " " << x.first << ":" << x.second;
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;
unordered_map<string, int>::iterator get = student.find ("zhangsan");
if ( get == student.end() )
cout << "not found";
else
cout << "found "<<get->first << " is " << get->second<<"\n\n";
student.at("zhangsan") = 18;
student["zhangsan"] = 17;
// 1. 通过位置
student.erase(myrecipe.begin());
// 2. 通过key
student.erase("milk");
student.clear();