簡體   English   中英

比較器-重載運算符

[英]Comparator - overloading the operator <

我正在嘗試使用std::set包含三個成員變量的結構。

 struct blah{
       int  a,b,c;
       bool operator < ( const blah& blo  ) const{
           return ( a < blo.a || (a == blo.a && (b != blo.b || c != blo.c ) ) );
       }
 };

但我不斷收到一個錯誤,提示我的運算符<無效。 我的方法有什么問題? 在此處輸入圖片說明

    struct blah {
           int  a,b,c;
                blah(int aa,int bb,int cc){ a=aa; b=bb; c=cc; }
           bool operator < ( const blah& blo  ) const{
               return ( a < blo.a 
                              || (a == blo.a && b < blo.b  )
                              || (a == blo.a && b == blo.b && c < blo.c  ) 
                      );
           }
     };

    int main() {
            std::set<blah> st;

            st.insert(blah(1,2,3));
            st.insert(blah(1,1,1));
            st.insert(blah(1,3,2));
            return 0;
    }

在更改@paxdiablo代碼之后的代碼后,此方法運行良好。 謝謝大家!

在以下完整程序中,該代碼對我來說很好編譯

#include <iostream>

struct blah {
       int  a,b,c;
       bool operator < ( const blah& blo  ) const{
           return ( a < blo.a || (a == blo.a && (b != blo.b || c != blo.c ) ) );
       }
 };

int main (void) {
    blah x, y;
    x.a=2; x.b=2; x.c=2;
    y.a=2; y.b=2; y.c=2;
    if (x < y) std::cout << "x<y\n";
    if (y < x) std::cout << "x>y\n";
    if (!(y < x) && !(x < y)) std::cout << "x=y\n";
    return 0;
}

更改xy的字段將輸出不同的消息。

但是我發現該功能存在一個主要問題。 它可以告訴您x < y y < x兩者,在兩個a字段相同但b字段在兩者之間不同的情況下。 如果同時設置了a字段1,設置b字段21 ,您會看到:

x<y
y<x

那不會很好地結束:-)

正是你得到的是一個調試斷言(某事的具體建趕上大多在調試代碼的運行時錯誤),這一事實使我相信,運行時庫可以明確地檢查不正確operator<通過檢測重載后一種情況下(即, x < y y < x都為真)。

您應該真正解決此問題,因為這將導致集合的各種問題(例如,您需要對事物進行排序)。

舉例來說,假設您要使用abc作為該優先級的鍵。 要執行此操作的函數將包含以下內容:

// Check primary key.

if (a < blo.a) return true;
if (a > blo.a) return false;

// Primary key equal here, use secondary key.

if (b < blo.b) return true;
if (b > blo.b) return false;

// Primary and secondary keys equal here, use tertiary key.

return (c < blo.c);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM