4.5 更易型算法和关联式容器
关联式容器的全部迭代器均被声明为指向常量,若是更易关联式容器中的元素,会致使编译错误。 因此,从关联式容器中删除元素,须要调用它们的成员函数。 list针对全部更易型算法提供了一些对应的成员函数,若是使用list,就应该使用这些成员函数,此外,这些成员函数真正移除或改变了元素,而不是算法提供的只是进行了某种“移动”。算法
5 判断式
5.1 Unary Predicates(一元判断式)
一元判断式会检查惟一参数的某项特性。例如:find_if编程
std::find_if(col.begin(),col.end(),isPrime);
//返回找到的符合条件的第一个元素的位置(迭代器)或返回传入的第二个迭代器参数
Binary Predicates(二元判断式)
二元判断式的典型用途是,比较两个参数的特定属性。例如,为了依照你本身的原则对元素排序,必须以一个简单的predicate形式提供这项原则,若是元素自己不支持operator<,或若是你想使用不一样的排序原则,二元判断式就派上了用场。less
std::sort(col.begin(),col.end(),user_defined_func);
6 仿函数
仿函数是泛型编程强大威力和纯粹抽象概念的又一个例证。任何东西,只要其行为像函数,它就是一个函数。所谓的函数行为,就是指“可使用小括号传递参数,以调用某个东西”的行为。 仿函数的优点函数
- 仿函数是智能型函数(smart function),能够有本身的状态,能够作到普通函数难以完成的事。
- 每一个仿函数都有本身的型别。
- 仿函数一般比通常函数速度快。
6.1 预先定义的仿函数
- operator<的缺省排序准则是less<>,因此,若是反向排列某些元素很简单:
std::set<int,greater<int> > col;
- negate<in>() 将传进来的int值设定为负。
容器的使用注意事项
1. 容器元素的条件
STL容器元素必须知足一下三个基本要求:测试
- 必须可经过copy构造函数进行赋值,副本与本来必须相等。
- 必须可经过assignment操做符完成赋值动做
- 必须能够经过析构函数完成销毁操做
- 对序列容器而言,元素的default构造函数必须可用
- 对于某些动做,必须定义operator==以执行相等测试
- 在关联式容器中,元素必须定义出排序准则。缺省为operator<,经过less<>被调用
2. STL只支持value语意,不支持reference语意
3. STL的使用
- 迭代器务必合法而有效。注意:**迭代器可能会由于其余动做的反作用而变得无效,例如当vector和deque发生元素的安插、删除或从新配置时,迭代器可能所以失效
- 一个迭代器若是指向“逾尾(past-the-end)”位置,它并不指向任何对象,所以不能对它调用operator*或operator->。这一点适用于任何容器的end()和rend()所返回的迭代器
- 区间必须是合法的
- 某个区间的先后连个迭代器,必须指向同一个容器
- 从第一个迭代器出发,必须能够到达第二个迭代器所指位置
- 若是涉及的区间不止一个,第二个区间及后继各区间必须拥有“至少和第一个区间同样多”的元素
- 覆盖动做中的“目标区间”必须拥有足够多的元素,不然必须使用insert iterator。
4. STL的异常处理
C++标准库有以下保证:code
- 对于全部“以节点为实现基础”的容器如list、set、multiset、map和multimap,若是节点构造失败,容器保持不变,移除节点的动做保证不会失败
- 全部“以array为构造基础”的容器如vector和deque,安插元素时若是失败,都不可能作到彻底回复