【问题标题】:Why do comparison operators exist between C++ containers? [closed]为什么 C++ 容器之间存在比较运算符? [关闭]
【发布时间】:2018-07-14 09:42:06
【问题描述】:

我的问题,或者更确切地说,困扰我的问题是以下代码编译:

auto nonsense = std::vector<int>{20,30,40,50} < std::vector<int>{21,29,41,49}

为什么会这样?

比较是什么意思?

在我看来,这并不明显(也可以是平均比较、所有值之间比较的总和、最大/最小比较、长度比较、分配的整个内存区域的比较......等等)什么“比较两个数组”意味着在==!= 的情况之外,那么为什么这些运算符会存在呢?他们的预期目的是什么?为什么要引入它们,为什么没有从标准中删除?

【问题讨论】:

  • lexicographical comparison 的用例可能足够多,这些操作存在。
  • 答案在语言规范中。你为什么在这里问?
  • 我认为,如果您以稍微不那么好斗的方式提出您的问题,您将获得更少的反对票。也许放弃“......为什么他们没有从标准中删除?”部分。
  • 这是基于意见的。答案(包括当前的答案)几乎可以说:因为有人认为这是个好主意,但你不这么认为。
  • 代码中没有显示“不等式”(又名“不等于”:!=)运算符。

标签: c++ containers std c++17


【解决方案1】:

首先,std::vector 是一个设计良好的结构,虽然这个“特性”起初可能看起来很奇怪,但它存在于标准中是有意义的。

在我们讨论为什么之前,我们应该先了解什么

当您使用&lt; &lt;= &gt;= &gt; 运算符比较两个向量时,您正在执行lexicographical 比较(更具体地说,它实际上是std::lexicographical_compare,您可以阅读here) .

These overloads 是作为与向量进行比较的简写方式。它可能对您来说似乎没有用,但它是比较两个向量的好方法。如果您对矢量比较有其他想法,则由您来实现。

标准只能做这么多,即使它看起来小众或无用,总有一个原因。在这种情况下,这是因为委员会同意字典比较是最明智的“默认”。

【讨论】:

  • 好吧,我的问题是更多地处理“为什么”存在默认值,而不是默认值应该做什么。这似乎是编写std::lexicographical_compare 的速记方式,不值得将这样的“抽象”功能添加到大多数其他方法和运算符都是“显而易见”的类中。例如,我可以使用emplace_back 而不是进行容量检查、last() 迭代位置检查、可能的 realloc 和移动自己,这非常好,因为这是任何人都想用向量做的一件事。但是为什么lexicographical_comp 会被如此广泛地使用呢?与平均比较相反?
  • @George:重要的是要认识到 STL 派生类具有 数学 基础。 vector 不是动态大小的数组;它是表示数学 vector 的容器:某个维度的元素的有序集合。因此,默认使用字典比较是完全合理的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
  • 2021-04-23
  • 2018-09-23
  • 1970-01-01
  • 2013-01-15
相关资源
最近更新 更多