C++ 中的 std::find_if 演算法
Jinku Hu
2023年10月12日
本文將演示如何使用 C++ 標準模板庫中的 std::find_if
演算法。
使用 std::find_if
函式搜尋滿足給定條件的元素
std::find_if
函式是 STL 演算法的一部分,它提供了一種在滿足給定條件的範圍內搜尋元素的方法。也就是說,條件被指定為一個可呼叫的物件,它返回一個 bool
值。
std::find_if
函式的基本過載接受兩個迭代器,表示需要搜尋的範圍。第三個參數列示用於評估範圍內元素的可呼叫物件。請注意,範圍迭代器至少應滿足 LegacyInputIterator
要求。
std::find_if
返回滿足給定條件的第一個元素的迭代器,如果沒有找到這樣的元素,則返回第二個引數迭代器。
在下面的程式碼片段中,我們在 std::string
物件上使用 std::find_if
演算法,並使用 isupper
函式作為可呼叫物件。因此,該函式應該幫助我們確定字串是否只包含小寫字母。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main() {
string str1 = "this is random String";
string str2 = "this is";
string str3 = "wqz";
std::find_if(begin(str1), end(str1), isupper) != end(str1)
? cout << "str1 contains uppercase letters" << endl
: cout << "str1 contains only lowercase letters" << endl;
std::find_if(begin(str2), end(str2), isupper) != end(str2)
? cout << "str2 contains uppercase letters" << endl
: cout << "str2 contains only lowercase letters" << endl;
return EXIT_SUCCESS;
}
輸出:
str1 contains uppercase letters
str2 contains only lowercase letters
使用 std::find_first_of
函式在兩個範圍內搜尋元素匹配
std::find_first_of
是 STL 的另一個強大演算法,可用於在兩個給定範圍內搜尋相同的元素。這些函式接受四個迭代器作為引數,其中前兩個表示需要搜尋作為最後兩個迭代器引數傳遞的元素的範圍。
後兩個迭代器必須滿足 LegacyForwardIterator
的要求。在這種情況下,我們使用 std::find_first_of
演算法來檢查兩個字串中的字元是否匹配。該函式的返回值是搜尋範圍中與第二個範圍中的元素匹配的第一個元素的迭代器。如果沒有找到這樣的元素,則返回搜尋範圍的第二個迭代器。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main() {
string str1 = "this is random String";
string str2 = "this is";
string str3 = "wqz";
std::find_first_of(str1.begin(), str1.end(), str2.begin(), str2.end()) ==
str1.end()
? cout << "no letters match in str1 and str2" << endl
: cout << "some letters match in str1 and str2" << endl;
std::find_first_of(str2.begin(), str2.end(), str3.begin(), str3.end()) ==
str2.end()
? cout << "no letters match in str2 and str3" << endl
: cout << "some letters match in str2 and str3" << endl;
return EXIT_SUCCESS;
}
輸出:
some letters match in str1 and str2
no letters match in str2 and str3
使用 find_end
函式用分隔符分割字串
另一方面,我們有 find_end
演算法來搜尋給定範圍序列在另一個範圍中的最後一次出現。與 std::find_first_of
一樣,該演算法接受表示兩個範圍的四個迭代器,但它試圖在第一個範圍內找到精確的序列匹配。
#include <iostream>
#include <string>
using std::cin;
using std::cout;
using std::endl;
using std::string;
int main() {
string str1 = "this is random String";
string str2 = "this is";
string str3 = "wqz";
auto ret = std::find_end(str1.begin(), str1.end(), str2.begin(), str2.end());
ret == str1.end() ? cout << "no such sequence found" << endl
: cout << "last occurrence found at "
<< std::distance(str1.begin(), ret) << endl;
ret = std::find_end(str2.begin(), str2.end(), str3.begin(), str3.end());
ret == str2.end() ? cout << "no such sequence found" << endl
: cout << "last occurrence found at "
<< std::distance(str2.begin(), ret) << endl;
return EXIT_SUCCESS;
}
輸出:
last occurrence found at 0
no such sequence found
作者: Jinku Hu