<没有成员的类的运算符

时间:2019-11-16 08:52:43

标签: c++ sorting operator-overloading

这有约定吗?它只需要在stl容器中进行排序即可。

我考虑了几种可能性,例如比较两个对象的地址,或者总是返回true,但我不确定什么是最好的。总是会用排序算法返回真正的混乱吗?

class empty {
    bool operator< (const empty& rhs) const {
        // ???
    }
}

P.S。  它可能发生在奇怪的情况下,例如当一个类仅基于#define等获取成员变量时,或者当该类已经由其他人编写并且您不想从根本上更改它而您需要放入它或一个类时将其转换为需要小于运算符的某些容器。

1 个答案:

答案 0 :(得分:2)

如果要使类型为“可排序”,但实际上并不关心排序顺序,则可以使小于运算符始终返回false。使它始终返回true将导致某些算法失败,因为如果PhoneCallReceiver: Sim Card - extra_asus_dial_use_dualsim -----> 0 PhoneCallReceiver: Sim Card - com.android.phone.extra.slot -----> 0 PhoneCallReceiver: Sim Card - slot -----> 0 PhoneCallReceiver: Sim Card - simslot -----> 0 PhoneCallReceiver: Sim Card - sim_slot -----> 0 PhoneCallReceiver: Sim Card - subscription -----> 0 PhoneCallReceiver: Sim Card - Subscription -----> 0 PhoneCallReceiver: Sim Card - phone -----> 0 PhoneCallReceiver: Sim Card - com.android.phone.DialingMode -----> 0 PhoneCallReceiver: Sim Card - simSlot -----> 0 PhoneCallReceiver: Sim Card - slot_id -----> 0 PhoneCallReceiver: Sim Card - simId -----> 0 PhoneCallReceiver: Sim Card - simnum -----> 0 PhoneCallReceiver: Sim Card - phone_type -----> 0 PhoneCallReceiver: Sim Card - slotId -----> 0 PhoneCallReceiver: Sim Card - slotIdx -----> 0 A<B则不是“严格的弱排序”。使运算符始终返回false表示所有实例都是等效的。如果使用稳定的排序算法,则不会移动任何元素。

如果您需要某种实际的排序,但实际上并不关心它是什么(例如,将元素放入B<A中),则可以std::map按地址进行比较。请注意,这不适用于return this < &rhs,因为当算法交换值时,它们的地址不会改变,但是std::sort()std::map可以,因为它们不依赖于移动值。请注意以下来自Peter的评论。

最后,请注意,没有成员的类仍然消耗一个字节的存储空间。您可以在不增加空间的情况下将std::setuint8_t存储在类中,并将其用作排序标准。