function template
<algorithm>

std::find_if_not

template <class InputIterator, class UnaryPredicate>   InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);
在范围内查找元素(否定条件)
返回一个迭代器,指向范围 [first,last) 中第一个使得 pred 返回 false 的元素。如果没有找到这样的元素,函数将返回 last

此函数模板的行为等同于
1
2
3
4
5
6
7
8
9
template<class InputIterator, class UnaryPredicate>
  InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred)
{
  while (first!=last) {
    if (!pred(*first)) return first;
    ++first;
  }
  return last;
}

参数

first, last
输入迭代器,指向序列的初始和末尾位置。使用的范围是 [first,last),它包含 firstlast 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。
pred
一元函数,它接受范围内的元素作为参数,并返回一个可转换为 bool 的值。返回值表明该元素是否在此函数的上下文中被视为匹配项。
该函数不得修改其参数。
这既可以是函数指针,也可以是函数对象。

返回值

指向范围中第一个使得 pred 返回 false 的元素的迭代器。
如果 pred 对所有元素都返回 true,则函数返回 last

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// find_if_not example
#include <iostream>     // std::cout
#include <algorithm>    // std::find_if_not
#include <array>        // std::array

int main () {
  std::array<int,5> foo = {1,2,3,4,5};

  std::array<int,5>::iterator it =
    std::find_if_not (foo.begin(), foo.end(), [](int i){return i%2;} );
  std::cout << "The first even value is " << *it << '\n';

  return 0;
}

输出
The first even value is 2


复杂度

最多线性于 firstlast 之间的 距离:对每个元素调用 pred,直到找到不匹配为止。

数据竞争

范围 [first,last) 中的一些(或全部)对象被访问(最多一次)。

异常

如果 pred 或迭代器上的操作抛出异常,则抛出异常。
请注意,无效的参数会导致 *未定义行为*。

另见