Boolan泛型编程第五周笔记
一.一个万用的Hash Fuction
三种形式:
1)设计成成员函数、
#include
class Customer{
//........
};
class CustomerHash
{
public:
std::size_t operator()(const Customer& c) const{
return /*........*/;
}
};
unordered_set customers;
2)设计成一般函数、
size_t customer_hash_func(const Customer& c)
{
return /*......*/;
}
3)以struct hash偏特化形式实现hash function。
class MyString
{
private:
char* _data;
size_t _len;
};
namespace std;
{
template<>
struct hash
{
size_t operatoe()(const MyString& s) const noexcept{
return hash()(string(s.get()));
}}}
二、Tuple用例
元之组合,数之组合。使用方法如下:
通过继承的方法来不断地剔除第一个参数,最终来实现对每一个元素的操作。
三、Type traits
用traits来实现类型的筛选,回答class中的默认构造、拷贝构造、拷贝赋值、析构函数重要不重要,是否是POD等,为算法服务。
对于自定义的类型,可以自己定义type traits的特化版本。
1)is_void类模板,
继承自_is_void_helper类模板,先把const、volatile属性拿掉,再传给__is_void_helper,利用它的泛化和特化void,判断是否是void;
2)is_integral类模板,
也是先把const、volatile属性拿掉,再利用__is_integral_helper的泛化和偏特化判断,如果不是和某种特化版本匹配的类型,那么就会使用泛化版本,泛化版本的回答是false;
四、cout
cout是一个iostream类的对象,它有一个成员运算符函数operator<<,每次调用的时候就会向输出设备输出内容;相当于重载了<<。
五、moveable
1、对vector的影响
2、对list影响
3、对deque影响
4、对multiset影响
5、对unordered_multiset影响
使用move虽无法减少拷贝的次数,但是可以提高拷贝构造的效率;