c++ - 为什么类 std::weak_ptr 没有运算符 <?

标签 c++ c++-standard-library

<分区>

我在 map 中使用弱指针作为键。然而,当我尝试编译时,我得到了丑陋的消息,我将其解释为我缺少 std::weak_ptr 的比较运算符,这显然是 std::map 所必需的,因为它根据以下命令对其元素进行排序键值。

但是,现在 weak_ptr 类是一个智能指针类型类,因此可以使用指向某些托管数据的指针。

这个类不提供 operator< 方法的基本实现有充分的理由吗?我的意思是,比较指针值对我来说似乎很明显,而且,如果需要它以不同的方式工作,那么应该能够扩展或重新定义该方法以获得预期的行为,而不是'是吗?

在这里,您的见解将不胜感激。 感谢期待。

最佳答案

std::owner_less 是将智能指针排序为映射中的键的正确方法。

#include <map>
#include <memory>
#include <string>

struct Foo
{
};

using my_key = std::weak_ptr<Foo>;
using my_comp = std::owner_less<my_key>;

int main()
{
    auto m = std::map<my_key, std::string, my_comp>();

    auto p = std::make_shared<Foo>();
    auto p1 = std::make_shared<Foo>();

    m.emplace(p, "foo");
    m.emplace(p1, "bar");

    p.reset();
    p1.reset();
}

关于c++ - 为什么类 std::weak_ptr 没有运算符 <?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49732741/

相关文章:

c++ - 为什么 regex_search 不需要命名空间

c++ - 初始化静态类成员

c++ - 单链链打印C++

c++ - 有哪些不同的可能方法可以降低给定程序中 vector 数组实现堆栈的时间复杂度……?

c++ - 如何(以及谁可以)实现 C++ 委员会定义的标准库功能?

c++ - 为什么 std::advance 不返回结果迭代器?

c++ - 使用分配器对 HashMap 进行高效序列化和反序列化

c++ - 当函数名称不带括号发送给cout时,编译器如何确定在运行时输出什么值? C++

c++ - 如何在 C++ 中将 ASCII 字符串转换为 UTF8 字符串?

c++ - std::string 复制构造函数是否自行在末尾添加空字符?