2008-10-18 48 views
1

我有一個std :: multimap其中key是一個自定義類。事情是這樣的:關鍵在std :: multimap的要求

Class X { 
public: 
    std::string s; 
    int x; 
    operator <(const X& other) const { return s < other.s; } 
}; 
std::multimap<X, int> mymap; 

現在,我想使用UPPER_BOUND和LOWER_BOUND遍歷以「S」的相同值的所有元素。我是否需要爲X實現一些其他運算符(例如:==)。或者它會像這樣正常工作?

而且,我應該提供的論據UPPER_BOUNDLOWER_BOUND?我假設我應該創建一個期望值爲「s」的虛擬對象?

回答

5

由於class X是multimap的關鍵,因此upper_bound()/lower_bound()的參數必須是該類型的參數。如果class X具有從std::string(這是X::s的類型)的隱式轉換,則可以將其用作upper_bound()/lower_bound()的參數。

的多重映射默認的比較是less<>這只是調用operator <() - 所以這是你需要有class X的唯一運營商的多重映射工作。

0

你只需要提供一個運算符==和<。

upper_bound和lower_bound就像任何其他find-type方法一樣,所以你需要同類型的對象來比較 - 在​​你的情況下,一個具有所需值s的'dummy'對象。

編輯:評論是正確的,你只需要運營商<爲lower/upper_bound,並找到。但是如果你想調用你的容器上的其他方法,你也需要operator ==。例如。如果你想排序()你的容器,你將需要operator ==。

您需要的所有STL容器的2個重載操作符是運算符<和運算符==。我發現它們都是最佳實踐。

當然,這個問題也可以通過在地圖本身中實現一個比較函數來更全面地回答,而不是依賴於對象。這通常是實現在地圖上調用find()的不同方法的好方法。

+0

您不需要提供運算符==()。 – 2008-10-18 23:14:33