范型算法 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/