为什么 std::equal 模板由两个类参数化?
Why is the std::equal template parametrized by two classes?
我正在使用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>::iterator
和std::vector<T>::const_iterator
.
反例:
struct foo {};
struct bar {
operator==(const foo&) { return false; }
operator!=(const foo&) { return true; }
};
使用标准算法,您可以检查bar
是否等于foo
,您不能对您的版本执行此操作。
此外,当您比较不同类型容器中的元素时,两种类型会有所不同。通常,标准库尝试尽可能通用。对于std::equal
的标准版本,所需要的只是您可以取消引用迭代器,然后比较元素。迭代器或元素的类型实际上是什么并不重要,只要可以比较元素即可。
相关文章:
- 为什么模板参数推导不适用于仅指定前两个参数的可变参数模板类?
- C++如何在 switch 语句中放置两个参数
- 为什么我不能用两个参数重载 C++ 运算符 []?
- C++添加检查以避免读取两个参数
- 宏的定义从一个值创建两个参数
- C++ 如何使用一个参数从派生类构造函数中调用具有两个参数的超类构造函数
- 通过将两个参数包的元素线程化为类型对来解压缩这两个参数包
- 'int main(int, int, std::__cxx11::string, std::__cxx11::string)'只需要零或两个参数 [-Wmain]
- 错误:函数调用中有两个参数
- Qt 线程两个参数
- 为什么lambda函数用于stl函数,例如sort(),c 中的max_element()函数以两个参数为输入
- 警告:用两个参数构造函数返回对象时,表达结果未使用
- 具有两个参数的 Decltype 修改类型
- 将两个参数传递到谓词remove_if
- 同时扩展两个参数包
- 用两个参数调用新操作员,但没有分配
- 在Variadic模板中交换两个参数
- C CPPUNIT_ASSERT具有两个参数
- 具有两个参数的乘法函数
- 使用一个可选参数获取两个参数到main