📅  最后修改于: 2023-12-03 15:29:49.950000             🧑  作者: Mango
在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表达式中的参数a
和b
分别代表正在比较的两个学生。我们在Lambda表达式中定义了一个自定义的比较条件,即比较学生成绩的大小。
在C++中,std::find和Lambda表达式结合使用可以轻松地在一个区间中查找满足某种条件的元素。它们的组合具有众多的优点,比如可读性好、可扩展性高、代码简洁等。因此,在开发过程中,我们可以多考虑使用它们。