find_if模板
Prerequisites:
find_if()函式
若在容器中找到元素就返回疊代器iterator,找不到就返回容器最後一個元素的下一個位址
增加搜尋值與傳回值
將foreach模板的程式拿來修改,增加搜尋值T3的模板參數與T1的模板傳回值。
找到欲搜尋的值T3,就返回iterator
找不到就傳回容器最後一個元素的下一個位址。
1
2
3
4
5
6
7
template<typename T1, typename T2, typename T3>
T1 findif(const T1 first, const T1 last, T2 callback, T3 search_val) {
for (auto it = first; it != last; it++) {
if(callback(*it, search_val) == true) return it;
}
return last;
}
修改callback函式指標模板
增加搜尋值T的模板參數,傳回bool,判斷msg是否與要搜尋的值相同。
1
2
3
4
template<typename T>
bool callback(const T& msg, const T& search_val) {
return msg == search_val;
}
修改callback物件函式模板
增加搜尋值T的模板參數,傳回bool,判斷msg是否與要搜尋的值相同。
1
2
3
4
5
6
7
template<typename T>
class Callback {
public:
bool operator()(const T& msg, const T& search_val) {
return msg == search_val;
}
};
呼叫findif模板
傳回值為iterator,把iterator指標的值印出來。
1
2
vector<string>::iterator it1 = findif(v2.begin(), v2.end(), Callback<string>(), "03");
cout << "找到 = " << *it1 << endl;
完整程式碼
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
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
bool callback(const T& msg, const T& search_val) {
return msg == search_val;
}
template<typename T>
class Callback {
public:
bool operator()(const T& msg, const T& search_val) {
return msg == search_val;
}
};
template<typename T1, typename T2, typename T3>
T1 findif(const T1 first, const T1 last, T2 callback, T3 search_val) {
for (auto it = first; it != last; it++) {
if(callback(*it, search_val) == true) return it;
}
return last;
}
int main() {
vector<string> v2 = {"01", "02", "03", "04", "05"};
// 物件函式
vector<string>::iterator it1 = findif(v2.begin(), v2.end(), Callback<string>(), "03");
cout << "找到 = " << *it1 << endl;
// 函式指標
vector<string>::iterator it2 = findif(v2.begin(), v2.end(), callback<string>, "05");
cout << "找到 = " << *it2 << endl;
return 0;
}
找到 = 03
找到 = 05
物件函式,使用建構子,搜尋值作為參數
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
#include <iostream>
#include <vector>
using namespace std;
template<typename T>
class Callback {
public:
T search_val;
Callback(const T& search_val):search_val(search_val) {}
bool operator()(const T& msg) {
return msg == search_val;
}
};
template<typename T1, typename T2>
T1 findif(const T1 first, const T1 last, T2 callback) {
for (auto it = first; it != last; it++) {
if(callback(*it) == true) return it;
}
return last;
}
int main() {
vector<string> v2 = {"01", "02", "03", "04", "05"};
// 物件函式
vector<string>::iterator it1 = findif(v2.begin(), v2.end(), Callback<string>("03"));
cout << "找到 = " << *it1 << endl;
return 0;
}
技巧:
在迴圈中,若函式()返回true,就continue回到迴圈的條件判斷式,返回false就繼續執行接下來的程式碼。
之後sort模板會利用到這個技巧。