首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么std::相等模板被两个类参数化?

为什么std::相等模板被两个类参数化?
EN

Stack Overflow用户
提问于 2019-08-19 15:20:37
回答 3查看 70关注 0票数 0

我正在学习C++使用加速C++由Andrew和BarbaraE.Moo。在练习8-2中,作者要求我们实现一些库算法,其中包括相等算法.

以下是我写的:

代码语言:javascript
运行
复制
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。有人能解释为什么这是必要的吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-08-19 15:31:58

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

票数 2
EN

Stack Overflow用户

发布于 2019-08-19 15:27:19

反例:

代码语言:javascript
运行
复制
struct foo {};
struct bar {
    operator==(const foo&) { return false; }
    operator!=(const foo&) { return true; }
};

使用标准算法,您可以检查bars是否等于foo,您的版本不能这样做。

另外,当您比较不同类型容器中的元素时,这两种类型也不同。一般来说,标准库试图尽可能地泛化。对于std::equal的标准版本,所需要的只是可以取消迭代器的引用,然后比较元素。什么实际上是迭代器或元素的类型并不重要,只要可以比较这些元素。

票数 2
EN

Stack Overflow用户

发布于 2019-08-19 15:32:51

std::vector<T>::iterator是与std::set<T>::iterator不同的类型,但是如果不能调用混合了它们的equal,那就太烦人了。

更甚的是std::vector<T>::iteratorstd::vector<T>::const_iterator

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57559646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档