标签: strict-weak-ordering

通过'tuple'和'tie'实现比较运算符,这是一个好主意?

(注意:tuple并且tie可以从Boost或C++ 11中获取.)
当编写只包含两个元素的小结构时,我有时倾向于选择a std::pair,因为所有重要的东西都已经为该数据类型完成,例如operator<严格弱序.
但缺点是几乎没用的变量名.即使我自己创造了这个typedef,我也不会记得2天后究竟是什么first,second究竟是什么,特别是如果它们都属于同一类型.这对两个以上的成员来说更糟糕,因为嵌套pair非常糟糕.
另一种选择是tuple,无论是来自Boost还是C++ 11,但它看起来并没有更好,更清晰.所以我回去自己编写结构,包括任何需要的比较运算符.
特别是因为这operator<可能非常繁琐,我想通过依赖为tuple以下定义的操作来绕过这整个混乱:

示例operator<,例如严格弱排序:

bool operator<(MyStruct const& lhs, MyStruct const& rhs){
  return std::tie(lhs.one_member, lhs.another, lhs.yet_more) <
         std::tie(rhs.one_member, rhs.another, rhs.yet_more);
}
Run Code Online (Sandbox Code Playgroud)

(从传递的参数中引用tie一个引用.) tupleT&


编辑:从@DeadMG到私有继承的建议tuple并不是很糟糕,但它有一些缺点:

  • 如果运营商是独立的(可能是朋友),我需要公开继承
  • 通过铸造,我的功能/操作员(operator=特别是)可以轻松绕过
  • 有了这个tie解决方案,如果他们对订购无关紧要,我可以省略某些成员

我需要考虑这个实现有什么缺点吗?

c++ tuples operators c++11 strict-weak-ordering

94
推荐指数
2
解决办法
1万
查看次数

运算符<和严格弱序

如何operator<在n元组上定义(例如在3元组上)以便它满足严格的弱排序概念?我知道boost库有正确定义的元组类,operator<但由于某些原因我无法使用它.

c++ strict-weak-ordering

46
推荐指数
5
解决办法
2万
查看次数

stl排序 - 严格的弱排序

为什么STL使用严格弱排序的比较函数?为什么不能进行部分订购?

c++ algorithm stl strict-weak-ordering

18
推荐指数
4
解决办法
7688
查看次数

STL less运算符和"invalid operator <"错误

我有一些代码可以在VS 10.0中编译好但是在下面的Orders地图中插入一些项目后,我在Microsoft调试库中收到"invalid operator <"错误.我的较少运算符很简单,只需将char字符串比较为8字节的字符串.任何人都知道为什么我会收到此错误?

typedef struct MY_orderID_t
{
    char orderID[8];
} MY_orderID_t;

struct std::less<MY_orderID_t>
{ 
   bool operator()(const MY_orderID_t& k1, const MY_orderID_t& k2) const
   {
       for( int i=0; i < 8; i++ )
       {
           if( k1.orderID[i] < k2.orderID[i] )
           return( true );
       }
       return( false );
   }
};

std::map< MY_orderID_t, MY_order_t > Orders[5];
Run Code Online (Sandbox Code Playgroud)

c++ dictionary stl strict-weak-ordering

14
推荐指数
3
解决办法
6190
查看次数

带有 std::map&lt;T*, U&gt; 的程序是否具有明确定义的行为?

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

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

#include <map>

int main()
{
    int x = 0, y = 1;
    bool arbitrary = false;

    std::map<int*, bool> m{
       {&x, arbitrary},
       {&y, arbitrary}
    };
}
Run Code Online (Sandbox Code Playgroud)

更一般地说,我们可以说带有指针键的映射是一个危险的*命题吗?或者有什么特别的规则我们可以依靠?

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

c++ sorting pointers language-lawyer strict-weak-ordering

14
推荐指数
2
解决办法
273
查看次数

是否有任何Python2的实现,其中排序是可传递的?

是否存在Python2的现有实现,其中排序是可传递的?也就是说,如果不创建用户定义的类型,则无法看到此行为:

>>> x < y < z < x
True
Run Code Online (Sandbox Code Playgroud)

由于这种反例,CPython不具有传递性

x = 'b'
y = ()
z = u'ab'
Run Code Online (Sandbox Code Playgroud)

但是,CPython中的这种排序仅记录为实现细节.

python sorting python-2.x transitivity strict-weak-ordering

8
推荐指数
1
解决办法
218
查看次数

是什么原因导致std :: sort()访问超出范围的地址

我知道要使用std :: sort(),比较函数必须是严格的弱顺序,否则它会因访问超出范围的地址而崩溃.(https://gcc.gnu.org/ml/gcc-bugs/2013-12/msg00333.html)

但是,当比较函数不是严格的弱顺序时,为什么std :: sort()访问越界地址?它试图比较什么?

我也想知道STL中是否还有其他陷阱需要注意.

c++ sorting stl strict-weak-ordering

6
推荐指数
1
解决办法
1536
查看次数

较大的运算符“&gt;”是否满足严格的弱排序?

定义

<二元关系,其中的a < b意思是“ a小于b”。

>二元关系,其中a > b“” a大于b“。

因此,我们假设<>具有我们通常在日常生活中使用的含义。但是,在某些编程语言(例如C ++)中,我们可以重载它们以给它们提供不同的定义,此后我们就不用考虑了。


内容

至于我读的数学定义严格弱序(如维基百科),我认为无论是<>satify它。但是,我在许多网站上看到的所有示例仅涉及<。甚至有一个网站

它们的大致含义是:严格弱排序必须按照“小于”的行为进行操作:如果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 …

c++ algorithm language-lawyer strict-weak-ordering

6
推荐指数
2
解决办法
137
查看次数

PartialOrdering,StrictWeakOrdering,TotalOrdering,应用程序的主要区别是什么

[SGI官方文件]

由于无反射性和传递性,operator <始终满足部分排序的定义.严格弱序的定义更严格,总排序的定义更严格.

我还阅读了文档中严格弱排序的定义:StrictWeakOrdering

前三个公理,无反射性,反对称性和传递性,是部分排序的定义; 严格弱排序的定义需要等价的传递性.总排序是满足更强条件的顺序:等价必须与平等相同.

我对这些定义不太确定.一些主要问题:

1. 偏序是否隐含地定义了等价?

2. 严格的弱订货总订货怎么样?

3.STL在排序算法中需要严格的弱排序,为什么不是部分排序或总排序? 对于这个问题,我通过证明规则满足三个公理来阅读一些证明有效比较规则的教科书:无反射性,反对称性,传递性,这是部分排序的定义,文件指的是运算符<总是满足这个定义,所以为什么我们不能只使用部分排序比较对象,或者等效地使用运算符

c++ sorting stl partial-ordering strict-weak-ordering

4
推荐指数
1
解决办法
1198
查看次数

在比较浮点数时使用 epsilon 是否会破坏严格弱排序?

以下课程是否打破了严格的弱排序(与常规相比std::less(因此忽略边缘情况值,例如 Nan))

struct LessWithEpsilon
{
    static constexpr double epsilon = some_value;
    bool operator() (double lhs, double rhs) const
    {
        return lhs + epsilon < rhs;
    }
};

LessWithEpsilon lessEps{};
Run Code Online (Sandbox Code Playgroud)

c++ floating-point epsilon strict-weak-ordering

4
推荐指数
1
解决办法
88
查看次数