在 Map 中,改變 Key 的惟一方法是先將它刪除,再插入一個(gè)修改過的值。不要對(duì) Key 進(jìn)行任何直接或間接的修改,這樣可能導(dǎo)致數(shù)據(jù)處于不確定的狀態(tài)。Map 的 Key 是 const 的,而 Set 則不一定,因?yàn)?C++ 標(biāo)準(zhǔn)沒有給出強(qiáng)制的規(guī)定。
文章來源:
http://my.donews.com/robinchow/2007/01/23/hoknidslvhgfwhsdmssqezjefwyazkshzcuh/
typename 常常在模板類的聲明或定義中用來聲明一個(gè)類型。在模板中,如果一個(gè)和模板參數(shù)相關(guān)的名字沒有在名字解析中被找到,或者被關(guān)鍵字 typename 修飾,則它不能作為一個(gè)類型??紤]下面的代碼:
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 和模板參數(shù)類型相關(guān),使用名稱解析不能找到并且沒有被關(guān)鍵字 typename 修飾,因此將導(dǎo)致編譯錯(cuò)誤,正確的方法是使用關(guān)鍵字 typename。
文章來源:
http://my.donews.com/robinchow/2007/01/18/gywtqxaalrvetoldhdtlmchhlsmnfxklwgem/
predicate(斷言)是指給出 yes/no 的函數(shù)或者函數(shù)對(duì)象。使用函數(shù)對(duì)象的好處是可以存儲(chǔ)變量。
predicate 通常被算法用來作用于一個(gè)元素并且給出一個(gè)判定,比如是否大于某個(gè)數(shù)。
有狀態(tài)的 predicate 是指狀態(tài)在運(yùn)行時(shí)可能改變的 predicate。對(duì)于有狀態(tài)的 predicate 來說,各個(gè)副本之間不是等價(jià)的。對(duì)于算法來說,要使用 有狀態(tài)的 predicate 需要滿足兩個(gè)條件:
- 算法必須保證不產(chǎn)生 predicate 的副本。
- 算法必須對(duì)元素以確定的順序來應(yīng)用 predicate(例如,first 到 last)。
C++ 標(biāo)準(zhǔn)不要求標(biāo)準(zhǔn)算法滿足以上兩個(gè)條件,因此建議不要使用帶狀態(tài)的 predicate。
文章來源:
http://my.donews.com/robinchow/2007/01/17/okqqyqklkznuiqhlavokqgztcltuwiqlsgcq/
范型算法 remove():
remove() 沒有真正從容器中刪除元素,容器的元素個(gè)數(shù)也不會(huì)改變。remove() 所做的是把未被刪除的元素往前移動(dòng),以填充被刪除元素留下的空位,而把被刪除元素移到容器后面。最后,remove() 返回一個(gè)指向第一個(gè)被刪除元素的 iterator,如果沒有元素被刪除,則返回 end() iterator。
remove() 如此工作的原因是它不是作用在容器上,而是作用在 iterator上,但是 iterator 并沒有像“刪除 iterator 指向的元素而不管是什么容器”的操作。要?jiǎng)h除元素必須要用到直接作用在容器上的操作,如 erase()。
文章來源:
http://my.donews.com/robinchow/2007/01/17/sowxiqnuyycsamoatekjugwfqwlehlxzztxi/