📅  最后修改于: 2023-12-03 14:39:57.448000             🧑  作者: Mango
在C++标准库中,std::equal_to是一个模板类,用于比较两个值是否相等。它在头文件functional中声明,具体定义如下:
template <typename T = void>
struct equal_to {
bool operator()(const T& lhs, const T& rhs) const;
};
可以看到,equal_to是一个函数对象(或者叫仿函数),它可以被用在STL算法中,比如std::find_if、std::adjacent_find等等。
equal_to的operator()方法接受两个参数,分别是要比较的两个对象。这里的T可以是任何类型,只要满足以下要求:
接下来,让我们来看看一个基于equal_to的示例:
#include <iostream>
#include <vector>
#include <algorithm>
#include <functional>
int main() {
std::vector<int> vec {1, 2, 3, 4, 5};
// 使用equal_to进行元素查找
const auto it = std::find_if(vec.cbegin(), vec.cend(), std::bind(std::equal_to<int>(), std::placeholders::_1, 3));
if (it != vec.cend()) {
std::cout << "Found " << *it << " at position " << std::distance(vec.cbegin(), it) << std::endl;
} else {
std::cout << "Not found" << std::endl;
}
// 使用equal_to判断元素是否相等
const bool result = std::equal_to<int>()(3, 3);
std::cout << "3 equals to 3? " << std::boolalpha << result << std::endl;
return 0;
}
上述代码使用了std::bind、std::placeholders、std::find_if和std::equal_to等多个函数对象来实现元素的查找和比较。其中,std::bind是一个函数模板,它可以将一个函数对象绑定到一组参数上,形成一个新的函数对象。std::placeholders::_1表示占位符,可以用来指定新函数对象的第一个参数。
std::find_if是标准库中用于查找元素的算法之一,它接受一个迭代器的范围和一个unary predicate(一元谓词),返回找到的第一个满足unary predicate的元素的迭代器。在上述代码中,使用std::bind将std::equal_to
std::equal_to
总的来说,std::equal_to是STL标准库中非常实用的一个函数对象。在实际开发中,我们可以利用它来促进程序的复用和可读性。