为什么std::equal_to很有用
Why is std::equal_to useful?
c++标准库提供了std::equal_to
。该函数对象默认调用T
类型的operator==
。
使用std::equal_to
的好处是什么?你能提供一个std::equal_to
有用的例子吗?
用于算法。它提供了一个带有操作符()的函子,因此可以通用地使用。
具体的(和人为的)示例,如注释中所要求的:
// compare two sequences and produce a third one
// having true for positions where both sequences
// have equal elements
std::transform(seq1.begin(), seq1.end(), seq2.begin(),
std::inserter(resul), std::equal_to<>());
不知道谁会需要它,但它是一个例子。
拥有std::equal_to
是非常有用的,因为它允许将相等比较用作函子,这意味着它可以作为参数传递给模板和函数。这对于相等操作符==
来说是不可能的,因为操作符不能作为参数传递。
考虑如何与std::inner_product
、std::find_first_of
和std::unordered_map
一起使用。
如今,情况并非如此。在lambdas之前,它作为==
调用的函子形式很有用,用于标准算法调用。现在你可以直接写[](auto& x, auto& y) { return x == y; }
主要用于作为模板参数传递给算法。不能将操作符指定为模板形参,但可以指定函数。典型的用法是:
template <class compare = std::equal_to<>, class T, class InIter>
bool contains(InIter begin, InIter end, T value, compare cmp={}) {
for (InIter p = begin; p != end; ++p)
if (cmp(*p, value))
return true;
return false;
}
如果您有(例如)一个包含多个字段的结构,您可能需要一个比较函数,它只比较指示身份的几个特定字段,比如一个人的姓名,而忽略其他字段,比如他们当前的体重、工资等级等。在这种情况下,您可以将比较函数作为模板参数传递,并且能够只比较您关心的字段。
对于其他情况,比如搜索一个整数数组,可以使用默认的比较函数
相关文章:
- "error: no matching function for call to"构造函数错误
- 调用专用模板时出错"no matching function for call to [...]"
- C++ Singleton - Prevent ::instance() to variable
- 我的项目不会像"undefined reference to `grpc::g_core_codegen_interface'"那样使用未定义的引用错误进行编译
- Visual Studio Code "undefined reference to `WinMain@16'"
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 如何解决"invalid conversion from 'char' to 'const char*'"
- 使用 MATLAB 编码器生成C++代码:编译错误"undefined reference to `rgb2gray_tbb_real64'"
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 尝试链接我的着色器时,我收到错误代码"error c5145 must write to gl_position"
- Python str to C++ to Python str
- 为什么创建友元类的实例会导致"undefined reference to"错误?
- System.InvalidCastException - SQL to C++ - safe_cast<float>
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 其中降频广播实际上是有用的
- "no matching function for call to 'Vector::Vector'"错误
- vector<vector<double>> to mxArray using memcpy
- Tensorflow c++ api undefined reference to 'tflite::D efaultErrorReporter()'
- 当覆盖存在时调用基本虚拟"binded to object"函数
- 提升序列化库有用吗?为什么不支持"pointer to pointer"序列化?