GeekBand笔记-《STL与泛型编程 》 第五周

1.一个万用的hash function

a.研究目的:为以hash table为底层的容器中所放置的元素写一个hash function。

b. hash function设计原则:产生的hash function尽可能减少冲突,使元素能够不重复。

一般思路:

利用基本数字类型(整数、浮点数、字符等)本身的hash function,将其简单的相加。

问题:元素容易冲突,每个篮子挂的元素多,查找缓慢。

2.tuple用例

Tuple是在C++2.0之后引进的一种存放元素的集合,通过这个集合,可以存放不同类型的数据。我们可以把他当做一个通用的结构体来用,不需要创建结构体又获取结构体的特征,在某些情况下可以取代结构体使程序更简洁,直观。

Tuple的实现原理:


Tuple中的成员函数:

a. Head():返回第一个元素值;

b. tail():返回父类成分起点,返回类型为父类类型,但实际是自己这种类型的对象,而由于类型指定,实际返回的就是父类对象。

3.Typetraits以及traits 实现

G2.9的type traits写的非常简单,泛化版本(默认)六个typedef,拷贝构造、析构函数等都是重要的。对于这个版本的Type traits,需要使用者自己特化一个自己这种类型的Type traits,实用性不高。

C++11提供了大量查询项目,不需要再重新定义特化版本的Typetraits,系统能够自动得到具体的属性特征。其提供查询的项目如下:


那么type traits是怎么实现的呢,以is_void为例,它先要将const和volatile(多线程用到,易挥发)拿掉,用remove_cv函数实现,remove_const和remove_volatile各用一个泛化和偏特化版本的函数来使得传入的是否有const(volatile)都会去掉这两个。然后再进入_is_void_helper,如果是void那么传回真,如果不是则传回假,也是用泛化和偏特化。

在完成本周作业时,参考了一些C++ Trait的相关资料,现列出作为课程拓展,同时也与课程所讲互为补充:

traits是一种特性萃取技术,它在Generic Programming中被广泛运用,常常被用于使不同的类型可以用于相同的操作,或者针对不同类型提供不同的实现.traits在实现过程中往往需要用到以下三种C++的基本特性:
enum
typedef
template (partial) specialization
其中:
enum用于将在不同类型间变化的标示统一成一个,它在C++中常常被用于在类中替代define,你可以称enum为类中的define;
typedef则用于定义你的模板类支持特性的形式,你的模板类必须以某种形式支持某一特性,否则类型萃取器traits将无法正常工作.看到这里你可能会想,太苛刻了吧?其实不然,不支持某种特性本身也是一种支持的方式.
template (partial) specialization被用于提供针对特定类型的正确的或更合适的版本.
借助以上几种简单技术,我们可以利用traits提取类中定义的特性,并根据不同的特性提供不同的实现.你可以将从特性的定义到萃取,再到traits的实际使用统称为traits技术,但这种定义使得traits显得过于复杂,我更愿意将traits的定义限于特性萃取,因为这种定义使得traits显得更简单,更易于理解.

全文链接如下:

http://www.cppblog.com/woaidongmao/archive/2008/11/09/66387.html

4.cout

cout是一个类的对象,extern表示cout可以被外界看到,它能接受这么多类型是因为它作了大量的<<重载。如果你想写自己的类型,那么就要仿照写出<<的重载。

5. moveable元素对于容器速度效能的影响

a.对vector的影响:

b.对list的影响:

c.对deque的影响:

 

d.对multiset的影响:

 

e.对unordered_multiset的影响:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值