标签: C++Primer 学习记录 关联容器
{key, value}
map<string, string> authors = { {"Joyce", "James"}, {"Austen", "Jane"} };
<
运算符来比较两个关键字。当然,也可以使用自定义的操作来比较两个关键字。此时必须在定义关联容器类型时就提供此操作的类型。
bool compare(const A &lhs, const A &rhs); // 关于下式,第一个 compare出现的地方需要的是函数指针类型,而 // decltype返回的是一个函数类型,所以 *必不可少。而第二个 compare // 出现的地方需要的是函数指针类型的实参,此时函数名可以自动转化为一个指针 set<A, decltype(compare)*> aSet(compare);
map<string, int>::value_type v3;
map<string, size_t> word_count; // 空 map word_count["Anna"] = 1;
==
运算符来组织元素。如果关键字类型固有就是无序的,或者性能测试发现问题可以用哈希技术解决,就可以使用无序容器,性能会更好。
hash
模板,可以直接定义关键字是以上类型的无序容器。但是,我们不能定义关键字类型为自定义类型的无序容器。一种方法是提供自定义类型的 hash模板版本,一种方法是重载 hash函数和==
运算符。
size_t hasher(cosnt A &a);
bool eqOp(const A &lhs, const A &rhs);
using A_set = unordered_multiset<A, decltype(hasher)*, decltype(eqOp)*>;
// 构造参数是桶大小、哈希函数和相等性判断运算符指针
A_set aSet(42, hasher, qeOp);