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模板會利用到這個技巧。

results matching ""

    No results matching ""