📜  c++ std::find with lambda - C++ (1)

📅  最后修改于: 2023-12-03 15:29:49.950000             🧑  作者: Mango

C++中使用std::find和Lambda表达式

在C++中,std::find是一个非常有用的算法,可以在一个指定的区间内查找特定的值,并返回该值的迭代器。而Lambda表达式是一种匿名函数,可以在需要函数的地方定义并使用它。

结合起来,std::find和Lambda表达式可以轻松地在一个区间中查找满足某种条件的元素。

使用示例

下面是一个简单的示例代码,可以在一个字符串的向量中查找长度等于3的字符串。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<std::string> words {"apple", "banana", "peach", "cherry", "grape"};

    auto result = std::find_if(words.begin(), words.end(), [](const std::string& s) {
        return s.length() == 3;
    });

    if (result != words.end()) {
        std::cout << "Found " << *result << std::endl;
    } else {
        std::cout << "Not found" << std::endl;
    }

    return 0;
}

输出结果为:

Found peach

在上面的代码中,我们使用std::find_if代替std::find,因为我们希望在字符串向量中查找满足特定条件的元素。Lambda表达式中的参数s是我们正在遍历的字符串,而几乎等于运算符==左边的return语句是我们的条件。查询的结果是一个迭代器,指向符合条件的第一个元素。

更复杂的示例

下面是一个稍微复杂的示例代码,可以在一个自定义对象的向量中查找最高的学生成绩。

#include <iostream>
#include <vector>
#include <algorithm>

class Student {
public:
    Student(const std::string& name, int score) : m_name(name), m_score(score) {}

    const std::string& getName() const { return m_name; }
    int getScore() const { return m_score; }

private:
    std::string m_name;
    int m_score;
};

int main() {
    std::vector<Student> students {{"Alice", 89}, {"Bob", 95}, {"Charlie", 72}, {"Dave", 84}};

    auto result = std::max_element(students.begin(), students.end(), [](const Student& a, const Student& b) {
        return a.getScore() < b.getScore();
    });

    if (result != students.end()) {
        std::cout << result->getName() << " has the highest score of " << result->getScore() << std::endl;
    } else {
        std::cout << "Not found" << std::endl;
    }

    return 0;
}

输出结果为:

Bob has the highest score of 95

在上面的代码中,我们使用了std::max_element代替了std::find。Lambda表达式中的参数ab分别代表正在比较的两个学生。我们在Lambda表达式中定义了一个自定义的比较条件,即比较学生成绩的大小。

总结

在C++中,std::find和Lambda表达式结合使用可以轻松地在一个区间中查找满足某种条件的元素。它们的组合具有众多的优点,比如可读性好、可扩展性高、代码简洁等。因此,在开发过程中,我们可以多考虑使用它们。