STL学习笔记(二)

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 预先定义的仿函数

  1. operator<的缺省排序准则是less<>,因此,若是反向排列某些元素很简单:
std::set<int,greater<int> > col;
  1. 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()所返回的迭代器
  • 区间必须是合法的
  1. 某个区间的先后连个迭代器,必须指向同一个容器
  2. 从第一个迭代器出发,必须能够到达第二个迭代器所指位置
  • 若是涉及的区间不止一个,第二个区间及后继各区间必须拥有“至少和第一个区间同样多”的元素
  • 覆盖动做中的“目标区间”必须拥有足够多的元素,不然必须使用insert iterator。

4. STL的异常处理

C++标准库有以下保证:code

  • 对于全部“以节点为实现基础”的容器如list、set、multiset、map和multimap,若是节点构造失败,容器保持不变,移除节点的动做保证不会失败
  • 全部“以array为构造基础”的容器如vector和deque,安插元素时若是失败,都不可能作到彻底回复
相关文章
相关标签/搜索