范型算法 remove():
remove() 沒有真正從容器中刪除元素,容器的元素個數也不會改變。remove() 所做的是把未被刪除的元素往前移動,以填充被刪除元素留下的空位,而把被刪除元素移到容器后面。最后,remove() 返回一個指向第一個被刪除元素的 iterator,如果沒有元素被刪除,則返回 end() iterator。
remove() 如此工作的原因是它不是作用在容器上,而是作用在 iterator上,但是 iterator 并沒有像“刪除 iterator 指向的元素而不管是什么容器”的操作。要刪除元素必須要用到直接作用在容器上的操作,如 erase()。
文章來源:
http://my.donews.com/robinchow/2007/01/17/sowxiqnuyycsamoatekjugwfqwlehlxzztxi/
predicate(斷言)是指給出 yes/no 的函數或者函數對象。使用函數對象的好處是可以存儲變量。
predicate 通常被算法用來作用于一個元素并且給出一個判定,比如是否大于某個數。
有狀態的 predicate 是指狀態在運行時可能改變的 predicate。對于有狀態的 predicate 來說,各個副本之間不是等價的。對于算法來說,要使用 有狀態的 predicate 需要滿足兩個條件:
- 算法必須保證不產生 predicate 的副本。
- 算法必須對元素以確定的順序來應用 predicate(例如,first 到 last)。
C++ 標準不要求標準算法滿足以上兩個條件,因此建議不要使用帶狀態的 predicate。
文章來源:
http://my.donews.com/robinchow/2007/01/17/okqqyqklkznuiqhlavokqgztcltuwiqlsgcq/
typename 常常在模板類的聲明或定義中用來聲明一個類型。在模板中,如果一個和模板參數相關的名字沒有在名字解析中被找到,或者被關鍵字 typename 修飾,則它不能作為一個類型。考慮下面的代碼:
template< typename T >
class X_base
{
public:
typedef T instantiated_type;
};
template< typename A, typename B >
class X : public X_base< B >
{
public:
bool operator()( const instantiated_type& i ) const
{
return i != instantiated_type();
}
// ... more stuff ...
};
instantiated_type 和模板參數類型相關,使用名稱解析不能找到并且沒有被關鍵字 typename 修飾,因此將導致編譯錯誤,正確的方法是使用關鍵字 typename。
文章來源:
http://my.donews.com/robinchow/2007/01/18/gywtqxaalrvetoldhdtlmchhlsmnfxklwgem/
在 Map 中,改變 Key 的惟一方法是先將它刪除,再插入一個修改過的值。不要對 Key 進行任何直接或間接的修改,這樣可能導致數據處于不確定的狀態。Map 的 Key 是 const 的,而 Set 則不一定,因為 C++ 標準沒有給出強制的規定。
文章來源:
http://my.donews.com/robinchow/2007/01/23/hoknidslvhgfwhsdmssqezjefwyazkshzcuh/