typename
1)typename var_name;表示var_name的定義還沒有給出,這個語句通常出現在模版的定義內,例如:
template <class T>
void f() {
typedef typename T::A TA; // 聲明 TA 的類型為 T::A
TA a5; // 聲明 a5 的類型為 TA
typename T::A a6; // 聲明 a6 的類型為 T::A
TA * pta6; // 聲明 pta6 的類型為 TA 的指針
}
因為T是一個模版實例化時才知道的類型,所以編譯器更對T::A不知所雲,為了通知
編譯器T::A是一個合法的類型,使用typename語句可以避免編譯器報錯。
2)template < typename var_name > class class_name; 表示var_name是一個類型,
在模版實例化時可以替換任意類型,不僅包括內置類型(int等),也包括自定義類型class。
這就是問題中的形式,換句話說,在template<typename Y>和template<class Y>中,
typename和class的意義完全一樣。
建議在這種語句中盡可能采用typename,以避免錯覺(以為只能替換class,不能只換int),
這也是C++新標准引進typename關鍵詞的一個初衷
set,vector
set中存放的是唯一的數值,而vector中沒此限制,set::find和set::insert消耗時間級別都為logN,但是因為使用的是紅黑樹,所以空間開銷較大。
1.使用set:當元素個數可能會變得足夠大,即N足夠大,logN和N的區別非常明顯之時,元素是隨機插入的,插入和搜索交互發生,無法預料下一次的操作。
2.使用sorted_vector:需要快速的搜索和遍歷,但是對插入的性能要求很低,或者元素是預先一次性插入的,然後排序好, 在此基礎上進行二分搜索。亦或者對內存限制較大。或者確信搜索操作和插入、刪除操作幾乎不交錯在一起。或者元素的插入是“幾乎有序”的,這樣的插入的額外負擔較小。