- 论坛徽章:
- 0
|
溜的循环有意义多了,这是事实,但使用循环更能让人明白加诸于迭代器上的操作。举例来说,假设想要找
出vector中第一个比x大又比y小的元素。这是使用循环的实现:
vector<int> v;
int x, y;
...
vector<int>::iterator i = v.begin(); // 从v.begin()开始迭代,直到
for( ; i != v.end(); ++i) { // 找到了适当的值或
if (*i > x && *i < y) break; // 到v.end()了
}
... // i现在指向那个值或等于v.end()
将同样的逻辑传给find_if是可能的,但是需要使用一个非标准函数对象适配器,比如SGI的compose2[1](参见
条款50):
vector<int>::iterator i =
find_if(v.begin(), v.end(), // 查找第一个find the first value val
compose2(logical_and<bool>(), // 使val > x
bind2nd(greater<int>(), x), // 和val < y都
bind2nd(less<int>(), y))); // 为真的值val
即使没使用非标准组件,许多程序员也会反对说它远不及循环清晰,我也不得不同意这个观点(参见条款
47)。
find_if的调用可以不显得那么复杂,只要将测试的逻辑封装入一个独立的仿函数类中:
template<typename T>
class BetweenValues:
public unary_function<T, bool> { // 参见条款40
public:
BetweenValues(const T& lowValue,
const T& highValue) // 使构造函数保存上下界
:lowVal(lowValue), highVal(highValue)
{}
bool operator()(const T& val) const //返回val是否在保存的值之间
{ |
|