C++中find_if查找vector中的特定struct以及值域查询

由于struct不是C++中的内置类型所以不能用std::find直接查找,而且find函数不能满足值域的查询。这个时候需要使用find_if来进行查询。

find_if函数

find_if是一个模板函数,函数原型及函数定义:

1
2
3
4
5
template <class InputIterator, class Predicate>
InputIterator find_if(InputIterator first, InputIterator end, Predicate pred) {
while (first != last && !pred(*first)) ++first;
return first;
}

函数参数

  • first : 起始迭代器
  • end : 结束迭代器
  • pred : 用于比较数值的函数或者函数对象(仿函数)。遍历条件即为pred()为真.

函数返回值

若有满足pred条件的元素,返回该元素的迭代器,否则返回end.

函数说明

该函数最重要的环节是pred,它的核心环节是重载()运算符,因为每个容器迭代器的*运算符得到的结果都是该容器的value_type的值,所以改重载函数的参数类型是value_type的引用类型

find_if函数应用

在struct的vector中查找特定的对象.特别注意的是:仿函数的参数类型是值的const引用,但是finder的构造参数是实际要比较的值的类型,在使用过程中,向构造函数中传的值是要比较的值。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
struct book{
int m_iID;
string m_strName;
book(int t_id, string t_name):m_iID(t_id), m_strName(t_name) {}
};
struct book_finder{
int m_iID;
book_finder(int t_id):m_iID(t_id) {}
bool operator() (const book& t) {return t.m_iID == m_iID;}
};
int main() {
vector<book> bookVc;
book book1(0, "书0");
book book2(1, "书1");
book book3(2, "书2");
book book4(3, "书3");
bookVc.push_back(book1);
bookVc.push_back(book2);
bookVc.push_back(book3);
bookVc.push_back(book4);
book target(1, "书");
if (std::find_if(bookVc.begin(), bookVc.end(), book_finder(target.m_iID)) != bookVc.end()) {
cout << "存在1" << std::endl;
} else {
cout << "不存在1" << std::endl;
}
target.m_iID = 10;
if (std::find_if(bookVc.begin(), bookVc.end(), book_finder(target.m_iID)) != bookVc.end()) {
cout << "存在10" << std::endl;
} else {
cout << "不存在10" << std::endl;
}
}