如何初始化按对象成员排序的unique_ptr键值std::map
关于std::map使用std::unique_ptr作为键的问题解答
问题1:设置std::map的比较器,让Person按firstName排序插入
std::map的第三个模板参数是比较规则的类型,需要定义一个能对比两个const std::unique_ptr<Person>&的逻辑,核心是比较指针指向的Person对象的firstName。
你可以定义一个自定义仿结构体:
struct ComparePersonByFirstName { bool operator()(const std::unique_ptr<Person>& lhs, const std::unique_ptr<Person>& rhs) const { // 若业务场景可能出现空指针,需额外添加空指针判断逻辑 return lhs->getFirstName() < rhs->getFirstName(); } };
之后声明map时指定该类型即可:
std::map<std::unique_ptr<Person>, std::string, ComparePersonByFirstName> phonebookMap2;
插入元素时,map会自动按照Person的firstName升序维护容器顺序。
问题2:为什么std::sort无法对std::map排序
报错原因有两点:
- 迭代器类型不兼容:std::map基于红黑树实现,其迭代器是双向迭代器,不支持
std::sort要求的随机访问迭代器操作(比如operator-),因此无法直接调用std::sort。 - std::map本身是有序容器:它会在插入元素时,自动通过你指定的比较器维护有序状态,不需要事后调用
std::sort重新排序。如果需要修改排序规则,只能在创建map时更换比较器类型,无法通过排序函数调整。
修正后的完整主函数示例
#include <iostream> #include <map> #include <memory> #include <string> #include "Person.h" struct ComparePersonByFirstName { bool operator()(const std::unique_ptr<Person>& lhs, const std::unique_ptr<Person>& rhs) const { return lhs->getFirstName() < rhs->getFirstName(); } }; int main() { std::map<std::unique_ptr<Person>, std::string, ComparePersonByFirstName> phonebookMap2; phonebookMap2.insert(std::make_pair(std::make_unique<Person>("Max", "Mustermann", "Bahnstr. 17"),"06151 123456")); phonebookMap2.insert(std::make_pair(std::make_unique<Person>("Hubert", "Kah", "Minnesängergasse 23"),"06151 654321")); // 直接遍历即可得到有序结果 for (const auto& entry : phonebookMap2) { std::cout << entry.first->getFirstName() << ": " << entry.second << std::endl; } return 0; }
内容的提问来源于stack exchange,提问作者Rokrait
相关产品推荐
相关产品推荐

