2015-01-06 46 views
8

karşılaştırın kullanmaz fark ettim:Neden std :: map aşırı operatörü <<a href="http://www.cplusplus.com/reference/map/map/operators/">http://www.cplusplus.com/reference/map/map/operators/</a> itibaren

"Bildirimi bu operasyonların hiçbiri dikkate ya kabın iç karşılaştırma nesnesi alır, ancak türden (elemanlarını karşılaştırmak olduğunu value_type) doğrudan. " Compare

karşılaştırın nerede

bu aşırı operatör "<" açıklamasında yılında Compare kullanmıyor yani

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; 

(http://www.cplusplus.com/reference/map/map/ bakınız): Bir ikili Iki eleman anahtarını bağımsız değişkenleri olarak alır ve bir bool döndürür. a fonksiyonu tanımlarınızı sipariş sıkı zayıf içinde b kala kabul ise comp bir nesne bu tip ve a ve b anahtar değerlerdir olduğu ifade comp(a,b), gerçek döneceğiz. harita nesnesi hem refleksle karşılaştırarak (elemanlar konteyner içinde takip edip iki elemanın olmadığını tuşları eşdeğerdir sırasını belirlemek için bu ifadeyi kullanır: onlar !comp(a,b) && !comp(b,a)) eğer eşdeğer olan bir harita yok iki unsur konteyner eşdeğer olabilir. anahtarlar. Bu üye türü map::key_compare olarak daha azını operatör (a<b). ad verilmiş uygulanması aynı veren bir işlev işaretçi veya bir işlev nesnesi (örnek için kurucu bakınız). less<T> Bu varsayılan olabilir.

Tam anlamıyorum Dayan, neden sadece "<" operatöründe Compare kullanın?

+0

Belki de fikir <'kullanmalıydı <', ancak daha az tahmin yanıtı duymak isterim. – Angew

+0

(gcc cinsinden), açıkça "lexicographical_compare" olarak adlandırıyorlar, neden görebildiğim kadarıyla karşılaştırma işlevini bu şekilde pervasızca yapmadıklarını anlamıyorum. Karşılaştırma işlevi isteğe bağlı olarak karmaşık olabilir ve bu durumda, yalnızca aynı konumdaki öğenin aynı olup olmadığı ile ilgilenir, bu nedenle daha basittir <<'daha verimli olabilir - ama tahmin edilebilir ... – Nim

+0

@Nim "Compare" functor'ı yaydılarsa, davranış standartta belirtilen bir şeyden sapacaktı. – juanchopanza

cevap

3

std::map aşırı operator <Compare

Çok iyi bir nedeni kullanmaz neden mantıklı davranışı sağlamak için kolay olmayacağını olmasıdır. Compare funkerinin durum bilgisi olabileceği düşünüldüğünde, aynı türden iki haritanın tamamen farklı sipariş kriterleri olabilir.

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? 

Bu ille vb < kullanmak için bir neden değildir, ama iyi bir nedeni Compare kullanmamayı: Örneğin,

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

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

    bool flip; 
}; 

Bu iki harita

aynı tür, ancak farklı bir düzeni vardır.

+0

Buradaki "çevirme" biraz ender olabilir ama ben buna katılıyorum ya da olmasın dize karşılaştırması sırasında farklı davranabilirim ... sanırım anladım. – athos

+0

@athos Konu, aynı türden iki operatörün farklı davranışları olabileceğidir. Bu yapay örnek sadece bunu açıklamak içindir. – juanchopanza

+0

kesinlikle haklısınız. Ben sadece bunu ifade ediyorum. – athos

4

Compare, key_type karşılaştırması içindir. Haritanın < işleci, , Compare, mapped_typevalue_type, yani Compare uygulanmıyor. value_type, key_type ve mapped_type çiftidir.

Dürüst olmak gerekirse, ilk önce haritaya bir operator< vermeyi düşünüyorum, aşırı yüklenen bir operatör aşırı yükleme durumu. Bir haritanın "diğerinden" daha az olduğunu söylemek ne anlama geliyor? lexigraphical_compare'u istiyorsanız, doğrudan arama yapmanızı veya kodunuzda harita karşılaştırmanızın ne anlama geldiğini en azından belgelemeyi öneririm.

+0

'Compare'' key_type' ile karşılaştırarak '' '' map :: mapped_type''ı karşılaştırarak mı demek istiyorsunuz? Size ulaşmıyorum ... – athos

+1

'Compare', belirli bir haritanın anahtarlarını sıralamak için dahili olarak kullanılır (kullanılan tuşlar O (lg n) 'de yapılabilir ve aynı zamanda std: : çalışmak için lower_bound'. Haritanın 'operatörü, iki haritayı birbiriyle karşılaştırmak için kullanılır. –

+0

Genellikle, karşılaştırmaların yalnızca aynı türdeki nesneler arasında anlamlı olması beklenir. Farklı 'karşılaştır 'işlevlerine sahip iki harita, bana iki farklı türde görünüyor. Aynı "karşılaştır" işlevini kullandılarsa, bunu bir <

İlgili konular