我正在学习C++使用加速C++由Andrew和BarbaraE.Moo。在练习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。有人能解释为什么这是必要的吗?
发布于 2019-08-19 15:31:58
有两种模板迭代器类型,这样就可以比较来自不同容器的元素,即使元素是相同的。例如,在最简单的情况下,将std::vector<int>
与std::deque<int>
进行比较并不适用于单个迭代器类型,而对于两种迭代器类型,则允许您比较不需要额外逻辑的int
序列。
发布于 2019-08-19 15:27:19
反例:
struct foo {};
struct bar {
operator==(const foo&) { return false; }
operator!=(const foo&) { return true; }
};
使用标准算法,您可以检查bar
s是否等于foo
,您的版本不能这样做。
另外,当您比较不同类型容器中的元素时,这两种类型也不同。一般来说,标准库试图尽可能地泛化。对于std::equal
的标准版本,所需要的只是可以取消迭代器的引用,然后比较元素。什么实际上是迭代器或元素的类型并不重要,只要可以比较这些元素。
发布于 2019-08-19 15:32:51
std::vector<T>::iterator
是与std::set<T>::iterator
不同的类型,但是如果不能调用混合了它们的equal
,那就太烦人了。
更甚的是std::vector<T>::iterator
和std::vector<T>::const_iterator
。
https://stackoverflow.com/questions/57559646
复制相似问题