For example, these cases:
using stringlist = std::list<string>;
std::map<stringlist, int> orderedMap;
std::unordered_map<stringlist, int> unorderedMap;
How will comparing keys in orderedMap work? Would it compare all items ('sub-keys') in the key one by one in lexical order?
How will computing hash in unorderedMap work?
An ordered map, by default, uses std::less to compare keys, which by default just does lhs < rhs.
The behavior of vector's operator < is described here: https://en.cppreference.com/w/cpp/container/vector/operator_cmp
And that of list is here: https://en.cppreference.com/w/cpp/container/list/operator_cmp
Yes, they just do a lexicographical comparison, i.e. they compare their elements one by one.
You can override the behavior by supplying a custom comparison as the third template parameter to map.
The default behavior of unordered_map is to use std::hash. std::hash does not have specializations for vector and list, so they are not usable as keys. The code should not compile. Try it here: https://godbolt.org/z/kgKmKS
You need to override the behavior by supplying a custom hasher as the third template argument to unordered_map. You can use Boost.Hash, which supports the standard containers: https://www.boost.org/doc/libs/1_73_0/doc/html/hash/reference.html
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With