如果 KEY 是 std::list 或 std::vector 而不是值,则 std::map 的默认行为是什么?

use*_*111 2 c++ dictionary

例如,这些情况:

using stringlist = std::list<string>;
    
std::map<stringlist, int> orderedMap;
std::unordered_map<stringlist, int> unorderedMap;
Run Code Online (Sandbox Code Playgroud)

比较关键在orderedMap工作中如何?它会按词法顺序一一比较键中的所有项目(“子键”)吗?

计算哈希将如何unorderedMap工作?

Seb*_*edl 11

map默认情况下,orderedstd::less用于比较键,默认情况下只是这样做lhs < rhs

vector's的行为在operator <这里描述:https : //en.cppreference.com/w/cpp/container/vector/operator_cmp

这的list是在这里:https://en.cppreference.com/w/cpp/container/list/operator_cmp

是的,他们只是进行字典比较,即他们一个一个比较他们的元素。

您可以通过提供自定义比较作为第三个模板参数来覆盖该行为map


的默认行为unordered_map是使用std::hash. std::hash没有针对vectorand 的特化list,因此它们不能用作键。代码不应该编译。在这里试试:https : //godbolt.org/z/kgKmKS

您需要通过提供自定义散列器作为第三个模板参数来覆盖该行为unordered_map。您可以使用支持标准容器的 Boost.Hash:https ://www.boost.org/doc/libs/1_73_0/doc/html/hash/reference.html