为什么std::equal模板由两个类参数化? 我正在用安德鲁·克尼格和Barbara E. Moo用C++加速学习C++。在练习8-2中,作者要求我们实现一些库算法,它们之间是相等的

为什么std::equal模板由两个类参数化? 我正在用安德鲁·克尼格和Barbara E. Moo用C++加速学习C++。在练习8-2中,作者要求我们实现一些库算法,它们之间是相等的,c++,C++,以下是我写的: 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的地方。有人能解释为什么这是必要的吗?反例: struct foo {}; struct bar { operator=

以下是我写的:

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的地方。有人能解释为什么这是必要的吗?

反例:

struct foo {};
struct bar {
    operator==(const foo&) { return false; }
    operator!=(const foo&) { return true; }
};
使用标准算法,您可以检查条形图是否等于foo,但您的版本不能这样做


此外,在比较不同类型容器中的元素时,这两种类型也不同。一般来说,标准库尽量通用。对于标准版本的std::equal,所需的只是可以取消对迭代器的引用,然后比较元素。迭代器或元素的实际类型并不重要,只要元素可以比较。

有两种模板迭代器类型,因此即使元素相同,也可以比较来自不同容器的元素。例如,在最简单的情况下,比较std::vector和std::deque无法使用单个迭代器类型,而使用两个迭代器类型,则可以比较int序列,而无需额外的逻辑。

std::vector::iterator与std::set::iterator是不同的类型,但如果你不能把它们混合在一起称之为平等,那就真的很烦人了

std::vector::iterator和std::vector::const_iterator更是如此