STL学习笔记(二)

4.5 更易型算法和关联式容器

关联式容器的所有迭代器均被声明为指向常量,如果更易关联式容器中的元素,会导致编译错误。 所以,从关联式容器中删除元素,需要调用它们的成员函数。 list针对所有更易型算法提供了一些对应的成员函数,如果使用list,就应该使用这些成员函数,此外,这些成员函数真正移除或改变了元素,而不是算法提供的只是进行了某种“移动”。

5 判断式

5.1 Unary Predicates(一元判断式)

一元判断式会检查唯一参数的某项特性。例如:find_if

std::find_if(col.begin(),col.end(),isPrime);
//返回找到的符合条件的第一个元素的位置(迭代器)或返回传入的第二个迭代器参数
Binary Predicates(二元判断式)

二元判断式的典型用途是,比较两个参数的特定属性。例如,为了依照你自己的原则对元素排序,必须以一个简单的predicate形式提供这项原则,如果元素本身不支持operator<,或如果你想使用不同的排序原则,二元判断式就派上了用场。

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++标准库有如下保证:

  • 对于所有“以节点为实现基础”的容器如list、set、multiset、map和multimap,如果节点构造失败,容器保持不变,移除节点的动作保证不会失败
  • 所有“以array为构造基础”的容器如vector和deque,安插元素时如果失败,都不可能做到完全回复

转载于:https://my.oschina.net/u/2602561/blog/754028

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值