1.一個萬用的hash function
a.研究目的:為以hash table為底層的容器中所放置的元素寫一個hash function。
b. hash function設計原則:產(chǎn)生的hash function盡可能減少沖突,使元素能夠不重復。
一般思路:
利用基本數(shù)字類型(整數(shù)、浮點數(shù)、字符等)本身的hash function,將其簡單的相加。
問題:元素容易沖突,每個籃子掛的元素多,查找緩慢。
2.tuple用例
Tuple是在C++2.0之后引進的一種存放元素的集合,通過這個集合,可以存放不同類型的數(shù)據(jù)。我們可以把他當做一個通用的結(jié)構(gòu)體來用,不需要創(chuàng)建結(jié)構(gòu)體又獲取結(jié)構(gòu)體的特征,在某些情況下可以取代結(jié)構(gòu)體使程序更簡潔,直觀。
Tuple的實現(xiàn)原理:
Tuple中的成員函數(shù):
a. Head():返回第一個元素值;
b. tail():返回父類成分起點,返回類型為父類類型,但實際是自己這種類型的對象,而由于類型指定,實際返回的就是父類對象。
3.Typetraits以及traits 實現(xiàn)
G2.9的type traits寫的非常簡單,泛化版本(默認)六個typedef,拷貝構(gòu)造、析構(gòu)函數(shù)等都是重要的。對于這個版本的Type traits,需要使用者自己特化一個自己這種類型的Type traits,實用性不高。
C++11提供了大量查詢項目,不需要再重新定義特化版本的Typetraits,系統(tǒng)能夠自動得到具體的屬性特征。其提供查詢的項目如下:
那么type traits是怎么實現(xiàn)的呢,以is_void為例,它先要將const和volatile(多線程用到,易揮發(fā))拿掉,用remove_cv函數(shù)實現(xiàn),remove_const和remove_volatile各用一個泛化和偏特化版本的函數(shù)來使得傳入的是否有const(volatile)都會去掉這兩個。然后再進入_is_void_helper,如果是void那么傳回真,如果不是則傳回假,也是用泛化和偏特化。
在完成本周作業(yè)時,參考了一些C++ Trait的相關資料,現(xiàn)列出作為課程拓展,同時也與課程所講互為補充:
traits是一種特性萃取技術(shù),它在Generic Programming中被廣泛運用,常常被用于使不同的類型可以用于相同的操作,或者針對不同類型提供不同的實現(xiàn).traits在實現(xiàn)過程中往往需要用到以下三種C++的基本特性:
enum
typedef
template(partial)specialization
其中:
enum用于將在不同類型間變化的標示統(tǒng)一成一個,它在C++中常常被用于在類中替代define,你可以稱enum為類中的define;
typedef則用于定義你的模板類支持特性的形式,你的模板類必須以某種形式支持某一特性,否則類型萃取器traits將無法正常工作.看到這里你可能會想,太苛刻了吧?其實不然,不支持某種特性本身也是一種支持的方式.
template(partial)specialization被用于提供針對特定類型的正確的或更合適的版本.
借助以上幾種簡單技術(shù),我們可以利用traits提取類中定義的特性,并根據(jù)不同的特性提供不同的實現(xiàn).你可以將從特性的定義到萃取,再到traits的實際使用統(tǒng)稱為traits技術(shù),但這種定義使得traits顯得過于復雜,我更愿意將traits的定義限于特性萃取,因為這種定義使得traits顯得更簡單,更易于理解.
4.cout
cout是一個類的對象,extern表示cout可以被外界看到,它能接受這么多類型是因為它作了大量的<<重載。如果你想寫自己的類型,那么就要仿照寫出<<的重載。
5. moveable元素對于容器速度效能的影響
a.對vector的影響:
b.對list的影響:
c.對deque的影響:
d.對multiset的影響:
e.對unordered_multiset的影響: