C++ 中的 std::find_if 演算法

Jinku Hu 2023年1月30日 2021年10月2日
  1. 使用 std::find_if 函式搜尋滿足給定條件的元素
  2. 使用 std::find_first_of 函式在兩個範圍內搜尋元素匹配
  3. 使用 find_end 函式用分隔符分割字串
C++ 中的 std::find_if 演算法

本文將演示如何使用 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::cout; using std::cin;
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::cout; using std::cin;
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::cout; using std::cin;
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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Algorithm