find函数共有上面三种形式,这三种形式都是对于区间元素逐个比较,直到找到符合条件的元素,所以该函数是线性复杂度,第一种返回的是区间中第一个等于value元素的位置,第二个返回第一个令op返回true的位置,第三种形式返回的是第一个令op返回false的位置,如果没有找到符合规则的元素,这三种形式都将返回end。
注意:
请看下面这个例子:
#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
我们再看第二个例子:
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.