问题标签 [strict-weak-ordering]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1003 浏览

c++ - std::sort 中的崩溃 - 没有严格弱排序的排序

我正在尝试对项目向量进行排序。如代码注释中所述,排序应为:

具有更多行动点 ( ) 的参与者mAp先走。当出现平局时,与mDisposition战斗发起者 ( ) 具有相同性格 ( ) 的参与者mBattleInitiator先走。

以下代码(简化示例)在 macOS 上崩溃,可能是由于我的排序实现不正确:

我已经查看了有关该主题的其他答案。他们中的大多数人只是说“将其实现为 a > b”,这在我的情况下不起作用。有一些似乎相关但对我没有帮助:

实现我所追求的最简单的方法是什么?

0 投票
2 回答
182 浏览

c++ - 如何通过严格的地图弱排序对数学向量进行排序?

我尝试编写一个 std::map< Vector3D, double > ,其中共线(平行或反平行)向量应该共享相同的键。

作为比较函数,我使用以下函数(在 isEqualEnough() 中具有 1e-9 容差),该函数是在使用 std::map 中的(数学)向量的帮助下创建的

当我将立方体的法线插入我的地图时,我应该得到 3 个不同的值(因为我不关心方向)但我得到 4 个:

  • x=1 y=0 z=0
  • x=0 y=1 z=0
  • x=0 y=0 z=1
  • x=0 y=2.2e-16 z=1

比较函数在某种程度上是错误的,但每当我尝试修复它时,我都会收到一个断言告诉我“表达式:无效比较器”。

有人发现错误吗?

0 投票
4 回答
128 浏览

c++ - 将元素传递给 std::sort 中的比较函数的顺序背后的逻辑是什么?

我正在练习 lambdas:

这只是 GeeksForGeeks 的代码,按降序排序,没什么特别的。我添加了一些打印语句(但在这篇文章中将它们取出)以查看 lambda 内部发生了什么。他们打印整个向量,以及ab值:

所以我更详细的问题是:向量元素传递到aandb参数的顺序背后的逻辑是什么?

迭代时是否b永久位于索引处?如果是这样,传递给 lambda 的第二个参数停留在第一个元素是不是有点奇怪?它是特定于编译器的吗?谢谢!0a

0 投票
1 回答
156 浏览

c++ - 指针值的严格弱排序

考虑以下结构:

我们如何在 x 和 y 上定义严格的弱排序,以便对象可以在 std::set 中使用?请注意,y 可以是空指针。如将 std::less 与 nullptr 一起使用中所述,std::less 在空指针上的行为未定义未指定。以下解决方案是否足够?

编辑:如果不是正确的方法是什么(例如如何将 std::less 与 std::tie 结合)?

0 投票
2 回答
292 浏览

c++ - 更大的运算符“>”是否满足严格的弱排序?

定义

让我们<成为一个二元关系,其中a < b意味着“a小于b”。

让我们>成为一个二元关系,其中a > b意味着“a大于b”。

因此,我们假设<>具有我们通常在日常生活中使用的含义。虽然,在某些编程语言(例如 C++)中,我们可以重载它们以赋予它们不同的定义,此后我们不再考虑这一点。


上下文

就我阅读严格弱排序的数学定义(例如Wikipedia)而言,我认为两者<兼而有之>。但是,我在许多网站上看到的所有示例都仅指<. 甚至有一个网站

他们大致的意思是严格的弱排序必须表现出“小于”的行为方式:如果a小于b,则b不小于a,如果a小于b且b小于c,则a小于 c,以此类推。


此外,在 N4140(C++14 国际标准)中,严格的弱排序定义为

(§25.4-4)如果我们定义equiv(a, b)!comp(a, b) && !comp(b, a),那么要求就是 ,comp并且equiv都是传递关系

其中comp定义为

(§25.4-2)Compare是一个函数对象类型(20.9)。应用于类型对象的函数调用操作的返回值Compare,当上下文转换为bool(第 4 条)时,true如果调用的第一个参数小于第二个参数,则产生,false否则。Compare comp始终用于假设排序关系的算法。


问题

">" 是否满足严格的弱排序?我希望如此,但没有信心。

0 投票
4 回答
286 浏览

c++ - 用 std::map 做一个程序有明确的行为?

比较指向不相关对象的指针有未指定的结果。

这似乎表明该程序可能具有未定义的行为,至少因为我们不能保证对键类型进行严格的弱排序:

那么,更一般地说,我们可以说带有指针键的映射是一个危险的*命题吗?还是我们可以在这里依靠一些特殊的规则?

* 从学术上讲,就是;实际上,我不知道主流实现实际上会在比较任意指针时引发地狱。

0 投票
2 回答
321 浏览

c++ - 如何强制 std::weak_ordering

在试用新品时领带拦截器三向比较运算符<=>我想知道这样的例子是什么

会导致编译器错误

但不与

什么是一个例子Foo?换句话说,如何Foo不暗示可替代性?我知道我可以编写自己的返回运算符的实现,std::weak_ordering ... less/greater/equivalent但是如何强制编译器这样做呢?

到目前为止,我已经阅读了 strong_ordering 和 weak_ordering的实际含义。

0 投票
1 回答
46 浏览

c++ - 为什么等价条件是必要的?

我对C++ 标准库中的代码段有疑问。我的问题是这!(p2.lastname() < p1.lastname())似乎没有必要,因为我认为条件代表姓氏在 p1 和 p2 中等效。如果我删除了条件,代码似乎可以正常工作。我看到了这种严格的弱排序。我阅读了相关文章,但我并没有完全理解这个概念。你能解释一下为什么需要这个条件吗?

0 投票
0 回答
38 浏览

c++ - 严格的弱排序问题(小于和小于等于运算符)

我正在尝试从 HackerRank 解决这个问题,其中我重载了小于(<) 和小于等于(<=) 运算符,以根据一些自定义条件比较对象。我的代码如下:

我遇到分段错误,但在我的本地计算机上,它工作正常。然后,我搜索并看到这可能是由于违反严格的弱排序而发生的。我有两个运算符重载,无法理解这种违规行为。

谁能详细解释我,以及如何避免它并仍然使用重载运算符?

0 投票
2 回答
105 浏览

c++ - 具有非唯一键排序但唯一比较的 std::map

考虑以下代码:

输出是1我期望的2。这似乎是由于仅attr1operator<. 但是,如果我是正确的,则比较不必是强排序,而是弱排序就足够了。这里还有其他错误还是我必须定义operator<一个

Key1 !< Key2 && Key2 !< Key1暗示Key1 == Key2

成立吗?