(注意: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);
}
(从传递的参数中引用tie一个引用.)  tupleT&
编辑:从@DeadMG到私有继承的建议tuple并不是很糟糕,但它有一些缺点:
operator=特别是)可以轻松绕过tie解决方案,如果他们对订购无关紧要,我可以省略某些成员我需要考虑这个实现有什么缺点吗?
如何operator<在n元组上定义(例如在3元组上)以便它满足严格的弱排序概念?我知道boost库有正确定义的元组类,operator<但由于某些原因我无法使用它.
为什么STL使用严格弱排序的比较函数?为什么不能进行部分订购?
我有一些代码可以在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];
这似乎表明该程序可能具有未定义的行为,至少因为我们不能保证键类型的严格弱排序:
#include <map>
int main()
{
    int x = 0, y = 1;
    bool arbitrary = false;
    std::map<int*, bool> m{
       {&x, arbitrary},
       {&y, arbitrary}
    };
}
更一般地说,我们可以说带有指针键的映射是一个危险的*命题吗?或者有什么特别的规则我们可以依靠?
* 从学术上讲,即;实际上,我不知道主流实现实际上会在比较任意指针时引发地狱。
是否存在Python2的现有实现,其中排序是可传递的?也就是说,如果不创建用户定义的类型,则无法看到此行为:
>>> x < y < z < x
True
由于这种反例,CPython不具有传递性
x = 'b'
y = ()
z = u'ab'
但是,CPython中的这种排序仅记录为实现细节.
我知道要使用std :: sort(),比较函数必须是严格的弱顺序,否则它会因访问超出范围的地址而崩溃.(https://gcc.gnu.org/ml/gcc-bugs/2013-12/msg00333.html)
但是,当比较函数不是严格的弱顺序时,为什么std :: sort()访问越界地址?它试图比较什么?
我也想知道STL中是否还有其他陷阱需要注意.
定义:
设
<二元关系,其中的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 …
由于无反射性和传递性,operator <始终满足部分排序的定义.严格弱序的定义更严格,总排序的定义更严格.
我还阅读了文档中严格弱排序的定义:StrictWeakOrdering
前三个公理,无反射性,反对称性和传递性,是部分排序的定义; 严格弱排序的定义需要等价的传递性.总排序是满足更强条件的顺序:等价必须与平等相同.
我对这些定义不太确定.一些主要问题:
1. 偏序是否隐含地定义了等价?
2. 严格的弱订货和总订货怎么样?
3.STL在排序算法中需要严格的弱排序,为什么不是部分排序或总排序? 对于这个问题,我通过证明规则满足三个公理来阅读一些证明有效比较规则的教科书:无反射性,反对称性,传递性,这是部分排序的定义,文件指的是运算符<总是满足这个定义,所以为什么我们不能只使用部分排序比较对象,或者等效地使用运算符
以下课程是否打破了严格的弱排序(与常规相比std::less(因此忽略边缘情况值,例如 Nan))
struct LessWithEpsilon
{
    static constexpr double epsilon = some_value;
    bool operator() (double lhs, double rhs) const
    {
        return lhs + epsilon < rhs;
    }
};
LessWithEpsilon lessEps{};
c++ ×9
sorting ×4
stl ×4
algorithm ×2
c++11 ×1
dictionary ×1
epsilon ×1
operators ×1
pointers ×1
python ×1
python-2.x ×1
transitivity ×1
tuples ×1