分类
(1)按map和set分;(2)按是否重复出现分;(3)按是否无序分。
定义
支持列表初始化
map <string,size_t> word_count = {{"0",0}};
set<int> exclude = {0, 1};
关键字支持的类型(重要)
1.定义内部比较函数
必须类型定义比较的运算,比如要么是重载<,要么定义成员比较函数。
2.或者外部定义一个普通函数也行
bool compareIsbn(const Sales_data &lhs, const Sales_data &rhs)
{
return lhs.isbn() < rhs.isbn();
}
map元素类型
其实是pair<>
迭代器与关键字
虽然map和set有const迭代器和普通迭代器,但由于关键字类型的限制,不能修改关键字。
set<int> exclude = {0, 1};
auto set_it = exclude.begin();
*set_it = 42; //xxx,说是operator*返回一个const值
解释:
set的元素类型是const的,而map的元素类型是pair,pair的第一个成员是const的
无序容器
不用比较运算符,用到哈希函数和关键字类型的==操作符 。但是具体怎么实现的呢?
hash函数
标准库为内置类型定义了hash模板,但是我们自己写的自定义类型就没有了。
可以先用外部函数替代一下:
size_t hasher(const Sales_data &sd)
{
return hash<string>()(sd.isbn()); //建一个hash<string>类型对象,然后调用里面的函数重载()
}
bool eqOp(const Sales_data &lhs, const Sales_data &rhs)
{
return lhs.isbn() == rhs.isbn();
}
怎么使用?
using SD_multiset = unordered_mutiset<Sales_data, dectype(hasher)*, dectype(eqOp)*>; //dectype得到函数指针
SD_multiset bookstore(42, hasher, eqOp); //设置桶数目,俩函数类型可以自动转为函数指针