c++ - 您可以使用自定义比较器将 std::map 转换为无序映射吗?

标签 c++ stl containers

由于使用了一个我不想编辑其代码的库,我发现自己需要使用 std::map<Identifier, String> .

struct compareIdentifiers
{
    bool operator()(const Identifier& a, const Identifier& b) const
    {
        // return a < b;
        return true;
    }
};

typedef std::map<Identifier, String, compareIdentifiers> IdentifierMap;

我应该返回 true 还是 false?无需进行比较。我想返回 true 或返回 false 在效率上会有很大不同,因为一个会导致 map 重新排序,另一个不会......对吧?

我尝试使用 std::unordered_map<Identifier, String>但出现错误:

错误 C2280“std::hash<_Kty>::hash(void)”:试图引用已删除的函数

最佳答案

总是返回true是无效的。这意味着(例如)A < BB < A两者都是真实的。这与 std::map 的要求相矛盾比较器,它强加了一个 strict weak ordering .返回 true 完全有可能使您的程序崩溃。

始终返回 false 是有效的,这实际上意味着所有键都被认为是相等的。因此只能将一个键添加到 map 中(感谢 aschepler 的更正)。

是什么阻止了您编写一个合理的比较器?

关于c++ - 您可以使用自定义比较器将 std::map 转换为无序映射吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56250047/

相关文章:

c++ - 我如何使用来自 IMAPI2 的 IFileSystemImage2 的 put_BootImageOptionsArray(获取 E_NOINTERFACE)?

c++ - (共享)指向单例的指针

c++ - 在 C++ 中使用 move 语义的正确方法是什么?

c++ - STL 中有解引用迭代器吗?

linux - 为什么 Docker 容器无法相互通信?

java - 在 Java 中迭代容器时出现令人沮丧的逻辑错误

c++:初始化列表顺序中的构造函数

c++ - 我如何遍历目录?

c++ - 何时编写迭代器?

kubernetes - 如何在命名空间的作业中运行 kubectl?