You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何初始化按对象成员排序的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排序

报错原因有两点:

  1. 迭代器类型不兼容:std::map基于红黑树实现,其迭代器是双向迭代器,不支持std::sort要求的随机访问迭代器操作(比如operator-),因此无法直接调用std::sort。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:45:31