泛型算法之 find、find_if 与 find_if_not

  1. InputIterator find (InputIterator beg, InputIterator end, const T& value);
  2. InputIterator find_if (InputIterator beg, InputIterator end, UnaryPredicate op);
  3. InputIterator find_if_not (InputIterator beg, InputIterator end, UnaryPredicate op);

find函数共有上面三种形式,这三种形式都是对于区间元素逐个比较,直到找到符合条件的元素,所以该函数是线性复杂度,第一种返回的是区间中第一个等于value元素的位置,第二个返回第一个令op返回true的位置,第三种形式返回的是第一个令op返回false的位置,如果没有找到符合规则的元素,这三种形式都将返回end。

注意:

  1. op不应该改变区间内的元素。
  2. 运行期间op的状态不应该被改变。
  3. 并联容器以及无序容许内部提供一个名为find()的成员函数,对于提供find函数的容器我们应该尽量使用成员函数,因为成员函数中的find一般有更好的效率,例如map中的find则是对数复杂度,而std::find的复杂度是线性的,
  4. 对于已排序的应该采用lower_bound,upper_bound(), equal_range(),或者binary_search()算法,(对于这几个算法我们后面介绍)。

请看下面这个例子:

#include 
#include 
#include 
#include 
using namespace std;

int main()
{
	vectorv1{ 1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1 };
	auto it1 = find(v1.begin(), v1.end(), 2);
	decltype(it1) it2;

	if (it1 != v1.end())
	{
		it2 = find(++it1, v1.end(), 2);
	}
	if (it1!=v1.end() && it2 != v1.end())
	{
		copy(--it1, ++it2, ostream_iterator(cout, " "));
		cout << endl;
	}

    return 0;
}
输出结果:2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 

其中有一点我们需要注意一下,那就是为什么copy(--it1, ++it2, ostream_iterator(cout, " "));这样输出的结果是2 3 4 5 6 7 8 9 8 7 6 5 4 3 2 ,这是因为我们的copy算法对区间的操作是左闭右开,所以这里打印的结果并没有错。

我们再看第二个例子:

int main()
{
    vectorv1{ 1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1 };

    auto it1 = find_if(v1.begin(), v1.end(), std::bind(std::greater(),std::placeholders::_1,3));
    auto it2 = find_if_not(v1.begin(), v1.end(), [](int n)
    {
	return  n < 8;
    });

    cout << *it1 << ends << *it2;
    return 0;
}

输出结果:4 8

这里我们第一种情况使用的是函数对象,查找的是一个大于3的值所以结果是4,对于find_if_not我们查找的是第一个>=8的值因此是8.

你可能感兴趣的:(STL算法)