unordered_map+自定义结构体
时间: 2023-11-01 22:56:10 浏览: 121
unordered_map是C++标准库中的容器,用于存储键-值对并提供快速的查找功能。对于自定义结构体,可以使用unordered_map来存储该结构体作为键,并指定自定义的哈希函数和键的比较规则。
有三种常见的方式可以实现这个目标:
方法一:将自定义结构体中重载operator == 和自定义hash函数,并在unordered_map中传入自定义结构体类型和自定义hash函数类型,不传入第四个参数。
```cpp
#include <iostream>
#include <unordered_map>
#include <functional>
class Person {
public:
int _age;
Person(int age = -1) :_age(age) {}
bool operator == (const Person& p) const {
return _age == p._age;
}
};
struct PersonHash {
public:
size_t operator()(const Person& p) const {
return std::hash<int>()(p._age);
}
};
int main() {
std::unordered_map<Person, int, PersonHash> um;
um.insert(std::make_pair<Person, int>(Person(1), 1));
um.insert(std::make_pair<Person, int>(Person(2), 1));
for (auto& e : um) {
std::cout << e.first._age << " " << e.second << std::endl;
}
return 0;
}
```
方法二:自定义hash函数和自定义键的比较规则,并在unordered_map中传入自定义结构体类型、自定义hash函数类型和自定义键的比较规则类型。
```cpp
#include <iostream>
#include <unordered_map>
#include <functional>
class Person {
public:
int _age;
Person(int age = -1) :_age(age) {}
};
struct PersonHash {
public:
size_t operator()(const Person& p) const {
return std::hash<int>()(p._age);
}
};
struct PersonEqual {
public:
bool operator()(const Person& p1, const Person& p2) const {
return p1._age == p2._age;
}
};
int main() {
std::unordered_map<Person, int, PersonHash, PersonEqual> um;
um.insert(std::make_pair<Person, int>(Person(1), 1));
um.insert(std::make_pair<Person, int>(Person(2), 1));
for (auto& e : um) {
std::cout << e.first._age << " " << e.second << std::endl;
}
return 0;
}
```
方法三:传入自定义结构体类型,不重载operator == 和自定义hash函数。
```cpp
#include <iostream>
#include <unordered_map>
class Person {
public:
int _age;
Person(int age = -1) :_age(age) {}
};
int main() {
std::unordered_map<Person, int> um;
um.insert(std::make_pair<Person, int>(Person(1), 1));
um.insert(std::make_pair<Person, int>(Person(2), 1));
for (auto& e : um) {
std::cout << e.first._age << " " << e.second << std::endl;
}
return 0;
}
```
以上是三种使用unordered_map存储自定义结构体的方法,具体使用哪种方式取决于你的需求和喜好。
阅读全文