C++ STL find与find_if的使用
STL的find,find_if函数提供了一种对数组、STL容器进行查找的方法。使用该函数,需要加上#include <algorithm>现在,我们要查找一个list中的数据,通常使用find(),vector,deque同理,如果是c++内置的类型,比如Int,double,string等,直接使用就行了int main(){list<int> lst...
一、find函数
STL的find函数提供了一种对数组、STL容器内的元素进行查找的方法。使用该函数,需要加上#include <algorithm>。
函数原型:
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的第一个元素。如果没有找到这样的元素,函数将返回last。函数使用运算符==将各个元素与val进行比较。
参数:first,last:
将迭代器输入到序列的初始和最终位置。搜索的范围是[first,last],它包含first和last之间的所有元素,包括first指向的元素,而不是last指向的元素。
val:要在范围中搜索的值。
T应为支持与InputIterator使用运算符==(元素为左侧操作数,val为右侧操作数)的元素进行比较的类型。
返回值:等于val的范围中第一个元素的迭代器。
1.1 内置类型的查找
如果是C++内置的类型,比如int,double,string等,直接使用就行了
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
vector<int> nums;
nums.push_back(10);
nums.push_back(20);
nums.push_back(30);
vector<int>::iterator it = find(nums.begin(), nums.end(), 10); // 查找vector中是否有元素“10”
if (it != nums.end()) // 找到了
{
cout << *it << endl;// do something
}
else // 没找到
{
cout << "not find" << endl;// do something
}
system("pause");
return 0;
}
1.2 自定义类的查找
如果是自定义类型,比如自定义的一个CPerson类,那么如何用find()函数进行查找呢?这时,我们需要提供一个判断两个CPerson对象“相等”的定义,find()函数才能从一个list中找到与指定的CPerson“相等”的元素。
这个“相等”的定义,是通过重载“==”操作符实现的,我们在CPerson类中添加一个方法,定义为:
bool operator==(const CPerson &rhs) const;
这样就可以进行查找了
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
class CPerson
{
public:
CPerson(void) {};
CPerson(int age):m_age(age)
{
};
~CPerson(void) {};
bool operator==(const CPerson &rhs) const
{
return (m_age == rhs.m_age);
}
CPerson(const CPerson & c)
{
m_age = c.m_age;
}
public:
int m_age; // 年龄
};
int main()
{
list<CPerson> lst;
CPerson *temp1 = new CPerson(10);
CPerson *temp2 = new CPerson(20);
CPerson *temp3 = new CPerson(50);
lst.push_back(*temp1);// 向lst中添加元素
lst.push_back(*temp2);
lst.push_back(*temp3);
CPerson cp_to_find; // 要查找的对象
cp_to_find.m_age = 20;
list<CPerson>::iterator it = find(lst.begin(), lst.end(), cp_to_find); // 查找list中是否有
if (it != lst.end()) // 找到了
{
cout << (*it).m_age << endl;// do something
}
else // 没找到
{
cout << "not find" << endl;// do something
}
system("pause");
return 0;
}
打印
二、find_if函数
find_if函数 带条件的查找元素,可以通过find_if函数来实现查找满足特定条件的元素。find_if函数依次的遍历容器的元素,返回第一个使函数为true的元素的迭代器,如果查找失败则返回end迭代器。它与find函数的区别就是不用重写==,而是自己定义查找条件。
函数原型
template<class InputIterator, class UnaryPredicate>
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{
while (first!=last) {
if (pred(*first)) return first;
++first;
}
return last;
}
查找map键值对,使用仿函数
#include <iostream>
#include <string>
#include <algorithm>
#include <map>
class map_value_finder
{
public:
map_value_finder(const std::string &cmp_string) :m_s_cmp_string(cmp_string) {}
bool operator ()(const std::map<int, std::string>::value_type &pair) // 仿函数
{
return pair.second == m_s_cmp_string;
}
private:
const std::string &m_s_cmp_string;
};
int main()
{
std::map<int, std::string> my_map;
my_map.insert(std::make_pair(10, "china"));
my_map.insert(std::make_pair(20, "usa"));
my_map.insert(std::make_pair(30, "English"));
my_map.insert(std::make_pair(40, "hongkong"));
std::map<int, std::string>::iterator it = my_map.end();
it = std::find_if(my_map.begin(), my_map.end(), map_value_finder("English"));
if (it == my_map.end()) {
printf("not found\n");
}
else {
printf("found key:%d value:%s\n", it->first, it->second.c_str());
}
return 0;
}
打印
查找结构体,使用lamda表达式
#include <iostream>
#include <vector>
#include <algorithm>
typedef struct testStruct
{
int a;
int b;
};
int main()
{
vector<testStruct> testStructVector = { {3,3},{0,2} };
auto itrFind = find_if(testStructVector.begin(), testStructVector.end(), [](testStruct myStruct) {
return myStruct.a > 2 && myStruct.b < 8;
});
if (itrFind != testStructVector.end()) {
cout << "found!";
}
else {
cout << "not found!";
}
return 0;
}
查找自定义的类 ,使用普通的bool全局函数
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
class CPerson
{
public:
CPerson(void) {};
CPerson(int age):m_age(age)
{
};
~CPerson(void) {};
bool operator==(const CPerson &rhs) const
{
return (m_age == rhs.m_age);
}
CPerson(const CPerson & c)
{
m_age = c.m_age;
}
public:
int m_age; // 年龄
};
//自定义的find函数,要求age=10
bool Equal_10(CPerson &rhs) {
return (rhs.m_age == 10);
}
int main()
{
list<CPerson> lst;
CPerson *temp1 = new CPerson(30);
CPerson *temp2 = new CPerson(20);
CPerson *temp3 = new CPerson(50);
lst.push_back(*temp1);// 向lst中添加元素
lst.push_back(*temp2);
lst.push_back(*temp3);
CPerson cp_to_find; // 要查找的对象
cp_to_find.m_age = 20;
list<CPerson>::iterator it = find_if(lst.begin(), lst.end(), Equal_10); // 查找list中是否有
if (it != lst.end()) // 找到了
{
cout << (*it).m_age << endl;// do something
}
else // 没找到
{
cout << "not find" << endl;// do something
}
return 0;
}
打印
参考:
更多推荐
所有评论(0)