2011-02-14 63 views
5

有時候,我不得不結構像這樣 -如何在集合結構中實現C++(in)相等運算符?

struct aggregate1 { 
    std::string name; 
    std::vector<ValueT> options; 
    size_t foobar; 
    // ... 
}; 

- 在哪裏(中)平等簡單地定義爲(在)所有成員的平等:lhs_name == rhs_name && lhs_options == rhs_options && lhs_foobar == rhs_foobar

什麼是最好的實現方式? (最佳爲:(Runtime-)效率,可維護性,可讀性)

  • operator!=
  • operator!=術語operator==operator==
  • 單獨實施的條款==!=
  • 作爲構件或設置爲免費功能?

注意,這個問題只是關於(不)平等OPS,作爲比較(<<=,...)不會使這種聚集太多的感覺。

回答

5

成員或自由函數是一個趣味問題,編寫==!=的單獨實現對我而言似乎很無聊,容易出錯(您可能會忘記兩個運算符中的一個運算符中的成員,並且需要時間通知),而無需增加任何效率(撥打其他運營商並申請!的成本可以忽略不計)。

的決定僅限於「是更好地在operator!=或相反的詞落實operator==

在我看來,在維修/可讀性/效率方面是相同的;我只建議如果你希望將其中一個或另一個用作「基本運算符」,唯一的情況是當你知道在你的結構中包含的類型中,運算符比它的否定速度快,但我不知道什麼時候會發生這種情況。

1

恕我直言,作爲朋友實施並實施operator==(有些STL算法例如rithms將依賴於此),並且operator!=應該作爲等號運算符的否定來實現。

5

我會這樣做,但也許將運算符==定義移動到cpp文件。離開操作員!=要內聯

請記住比較最有可能首先不同的成員變量,以便其餘部分短路並且性能更好。

struct aggregate1 { 
    bool operator==(const aggregate1& rhs) const 
    { 
    return (name == rhs.name) 
    && (options == rhs.options) 
    && (foobar == rhs.foobar); 
    } 
    bool operator!=(const aggregate1& rhs) const 
    { 
    return !operator==(rhs); 
    } 

    std::string name; 
    std::vector<ValueT> options; 
    size_t foobar; 

    // ... 
}; 
+0

同意。如果您仍然遇到運行效率問題,那麼您可能會考慮是否有些成員更可能與其他成員不同,並比較其他成員。 – 2011-02-14 20:26:54

0

( - :自答案:-)

我想強調的聚集WRT的一個方面效率

op==op!=評價的順序無關(平均)的表現。

假設單獨實施爲現在和給出的兩個極值(A-當量)所有子元素相等和(b-NEQ)所有子元素不相等,我們有這些情況下:

  • (A-當量)+ operator== :需要比較所有子元素返回true
  • (A-EQ)+ operator!=:需要比較所有子元素返回false
  • (b-NEQ)+ operator==:1之後su返回false B元素確定不相等的
  • (B-NEQ)+ operator!=:返回true第一子單元被確定之後不相等的

由於平均表現是一樣的無論哪種方式似乎 - 至少對我來說 - 根據op==更自然地實施op!=,因爲實施平等操作感覺更自然。

+0

我不明白你如何得出你的結論。運算符==和運算符!=將始終採用相同的時間量進行計算,並且執行它們的方式無關緊要。記住要保持你在線編寫的那個,以免支付任何通話費用。 – T33C 2011-02-15 09:19:48