关联容器

分类

(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); //设置桶数目,俩函数类型可以自动转为函数指针

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值