为什么 std::equal 模板由两个类参数化?

Why is the std::equal template parametrized by two classes?

本文关键字:两个 参数 equal std 为什么      更新时间:2023-10-16

我正在使用Andrew Koenig和Barbara E. Moo的加速C++学习C++。在练习 8-2 中,作者要求我们实现一些库算法,其中它们是相等的。

这是我写的:

template <class In>
bool my_equal(In b,In e,In d)
{
for (;b!=e;++b,++d)
if (*b!=*d) return false;
return true;
}

当我检查实现时,我发现我的几乎相同,除了它们在任何地方都使用不同的类来参数化 b,e 和 d。谁能解释为什么这是必要的?

有两种模板迭代器类型,因此即使元素相同,也可以比较来自不同容器的元素。例如,在最简单的情况下,将std::vector<int>std::deque<int>进行比较不适用于单个迭代器类型,而对于两个迭代器类型,它将允许您比较int序列,而无需额外的逻辑。

std::vector<T>::iterator是与std::set<T>::iterator不同的类型,但如果你不能混合使用它们来调用equal,那将非常烦人。

更何况std::vector<T>::iteratorstd::vector<T>::const_iterator.

反例:

struct foo {};
struct bar {
operator==(const foo&) { return false; }
operator!=(const foo&) { return true; }
};

使用标准算法,您可以检查bar是否等于foo,您不能对您的版本执行此操作。

此外,当您比较不同类型容器中的元素时,两种类型会有所不同。通常,标准库尝试尽可能通用。对于std::equal的标准版本,所需要的只是您可以取消引用迭代器,然后比较元素。迭代器或元素的类型实际上是什么并不重要,只要可以比较元素即可。