问题标签 [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.
c++ - std::sort 中的崩溃 - 没有严格弱排序的排序
我正在尝试对项目向量进行排序。如代码注释中所述,排序应为:
具有更多行动点 ( ) 的参与者mAp
先走。当出现平局时,与mDisposition
战斗发起者 ( ) 具有相同性格 ( ) 的参与者mBattleInitiator
先走。
以下代码(简化示例)在 macOS 上崩溃,可能是由于我的排序实现不正确:
我已经查看了有关该主题的其他答案。他们中的大多数人只是说“将其实现为 a > b”,这在我的情况下不起作用。有一些似乎相关但对我没有帮助:
- https://stackoverflow.com/a/16824720/904422 - 说其他标准算法也可以工作,但没有提到任何具体的例子
- https://stackoverflow.com/a/33508373/904422 - 令人困惑,似乎有点矫枉过正
实现我所追求的最简单的方法是什么?
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
比较函数在某种程度上是错误的,但每当我尝试修复它时,我都会收到一个断言告诉我“表达式:无效比较器”。
有人发现错误吗?
c++ - 将元素传递给 std::sort 中的比较函数的顺序背后的逻辑是什么?
我正在练习 lambdas:
这只是 GeeksForGeeks 的代码,按降序排序,没什么特别的。我添加了一些打印语句(但在这篇文章中将它们取出)以查看 lambda 内部发生了什么。他们打印整个向量,以及a
和b
值:
所以我更详细的问题是:向量元素传递到a
andb
参数的顺序背后的逻辑是什么?
迭代时是否b
永久位于索引处?如果是这样,传递给 lambda 的第二个参数停留在第一个元素是不是有点奇怪?它是特定于编译器的吗?谢谢!0
a
c++ - 指针值的严格弱排序
考虑以下结构:
我们如何在 x 和 y 上定义严格的弱排序,以便对象可以在 std::set 中使用?请注意,y 可以是空指针。如将 std::less 与 nullptr 一起使用中所述,std::less 在空指针上的行为未定义未指定。以下解决方案是否足够?
编辑:如果不是正确的方法是什么(例如如何将 std::less 与 std::tie 结合)?
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
始终用于假设排序关系的算法。
问题:
">" 是否满足严格的弱排序?我希望如此,但没有信心。
c++ - 用 std::map 做一个程序有明确的行为?
这似乎表明该程序可能具有未定义的行为,至少因为我们不能保证对键类型进行严格的弱排序:
那么,更一般地说,我们可以说带有指针键的映射是一个危险的*命题吗?还是我们可以在这里依靠一些特殊的规则?
* 从学术上讲,就是;实际上,我不知道主流实现实际上会在比较任意指针时引发地狱。
c++ - 如何强制 std::weak_ordering
在试用新品时领带拦截器三向比较运算符<=>
我想知道这样的例子是什么
会导致编译器错误
但不与
什么是一个例子Foo
?换句话说,如何Foo
不暗示可替代性?我知道我可以编写自己的返回运算符的实现,std::weak_ordering ... less/greater/equivalent
但是如何强制编译器这样做呢?
到目前为止,我已经阅读了 strong_ordering 和 weak_ordering的实际含义。
c++ - 为什么等价条件是必要的?
我对C++ 标准库中的代码段有疑问。我的问题是这!(p2.lastname() < p1.lastname())
似乎没有必要,因为我认为条件代表姓氏在 p1 和 p2 中等效。如果我删除了条件,代码似乎可以正常工作。我看到了这种严格的弱排序。我阅读了相关文章,但我并没有完全理解这个概念。你能解释一下为什么需要这个条件吗?
c++ - 严格的弱排序问题(小于和小于等于运算符)
我正在尝试从 HackerRank 解决这个问题,其中我重载了小于(<) 和小于等于(<=) 运算符,以根据一些自定义条件比较对象。我的代码如下:
我遇到分段错误,但在我的本地计算机上,它工作正常。然后,我搜索并看到这可能是由于违反严格的弱排序而发生的。我有两个运算符重载,无法理解这种违规行为。
谁能详细解释我,以及如何避免它并仍然使用重载运算符?
c++ - 具有非唯一键排序但唯一比较的 std::map
考虑以下代码:
输出是1
我期望的2
。这似乎是由于仅attr1
在operator<
. 但是,如果我是正确的,则比较不必是强排序,而是弱排序就足够了。这里还有其他错误还是我必须定义operator<
一个
Key1 !< Key2 && Key2 !< Key1
暗示Key1 == Key2
成立吗?