簡體   English   中英

為什么std :: map重載運算符<不使用Compare

[英]Why std::map overloaded operator < does not use the Compare

來自http://www.cplusplus.com/reference/map/map/operators/我注意到:

“請注意,這些操作都沒有考慮任何容器的內部比較對象,而是直接比較元素(類型為value_type)。”

這就是說重載運算符“<”在其聲明中沒有使用Compare (參見http://www.cplusplus.com/reference/map/map/

std::map
template < class Key,                                     // map::key_type
           class T,                                       // map::mapped_type
           class Compare = less<Key>,                     // map::key_compare
           class Alloc = allocator<pair<const Key,T> >    // map::allocator_type
           > class map;

Compare的地方

比較:二元謂詞,它將兩個元素鍵作為參數並返回一個bool 表達式comp(a,b) ,其中comp是此類型的對象, ab是鍵值,如果a被認為在函數定義的嚴格弱排序中的b之前,則返回true。 map對象使用這個表達式來確定元素在容器中遵循的順序以及兩個元素鍵是否相等(通過自反地比較它們:如果!comp(a,b) && !comp(b,a))它們是等價的!comp(a,b) && !comp(b,a)) 地圖容器中沒有兩個元素可以具有等效鍵。 這可以是函數指針或函數對象(請參閱示例的構造函數)。 默認為less<T> ,返回與應用小於運算符(a<b) 別名為成員類型map::key_compare

我不太明白,為什么不在“<”運算符中使用Compare

Compare用於比較key_type map的< operator實際上是比較mapped_type value_type而不是key_type ,因此Compare不適用。 value_typekey_typemapped_type的對。

但說實話,我認為給地圖operator<首先是操作員超載的情況太過分了。 一個地圖“小於”另一個地圖的意思並不是很明顯。 如果你想要lexigraphical_compare ,我建議你直接調用它,或者至少在代碼中記錄你的地圖比較意味着什么。

為什么std::map重載operator <不使用Compare

一個很好的理由是,確保有意義的行為並不容易。 鑒於Compare仿函數可以是有狀態的,相同類型的兩個映射可以具有完全不同的排序標准。 例如,

struct Cmp
{
  Comp(bool flip) : flip(flip) {}

  bool operator()(int lhs, int rhs) const
  {
    return flip ? lhs < rhs : rhs < lhs;
  }

  bool flip;
};

這兩個地圖具有相同的類型,但順序不同:

std::map<int, std::string, Cmp> m0(Cmp(false));
std::map<int, std::string, Cmp> m1(Cmp(true));

bool b = m0 < m1; // which Cmp should this use?

這不一定是使用< etc的原因,但不是使用Compare的充分理由。

暫無
暫無

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

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