std::find 解读
函数原型
find
是一个模板函数,函数原型如下
//在C++中的原型
template <class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val);
//在Qt中的原型
template<typename _IIter, typename _Tp>
_IIter find(_IIter, _IIter, const _Tp&);
函数功能
在给定范围内查找某个元素。该函数会在给定的范围 [first, last) 内,查找值等于val的第一个元素,并返回指向该元素的一个迭代器,如果没有元素等于val,则返回last。
该函数使用操作符==
将各个元素和val进行比较。
函数源码
template<class InputIterator, class T>
InputIterator find (InputIterator first, InputIterator last, const T& val)
{
while (first!=last)
{
if (*first==val) return first;
++first;
}
return last;
}
函数参数
first
和last
迭代器,表示要查找的起始和结束位置。val
表示要查找的值。val
必须是可以和迭代器所指向的元素类型进行比较的类型。
函数返回值
如果成功查找到与val
相等的元素,返回指向该元素的迭代器。否则返回last
。
vector元素是简单类型的查找
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector <int> vec; //定义一个元素类型为int的vector
vec.push_back(1); //添加元素
vec.push_back(2);
vec.push_back(3);
//查找元素
vector <int>::iterator it;
it = find(vec.begin(), vec.end(), 2); //查找值为2的元素
if(it != vec.end())
{
cout << "Found!" << endl;
}
else
cout << "Not found!" << endl;
return 0;
}
vector元素是复杂类型的查找
有时候vector的元素是类或者结构体,想通过类或结构体里面的某个变量的值来查找容器中是否存在这个元素,这个时候还用上面的方法是行不通的,因为find
的第三个参数必须是可以和vector元素直接进行==
比较的类型,因此需要我们重载==
运算符,实现我们希望达到的效果。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//自定义一个类
struct myclass
{
int val; //变量val
//重载运算符 ==
bool operator == (const int &x) //查找数值x是否与val相等
{
return (this->val == x);
}
};
int main(){
vector <myclass> vec;
vector <myclass>::iterator iter;
myclass a;
a.val = 1;
vec.push_back(a);
a.val = 2;
vec.push_back(a);
a.val = 3;
vec.push_back(a);
iter = find(vec.begin(), vec.end(), 2); //查询val为2的元素
if(iter != vec.end())
{
cout << "Found!" << endl;
}
else
cout << "Not found!" << endl;
return 0;
}