Yineleyici verildiğinde, bu yineleyicinin başvurduğu koleksiyon için doğru karşılaştırma işlevini almak/kullanmak mümkün mü?Bir iteratör verilen içindekinin karşılaştırma işlevi geri alma
Örneğin, ben genel bir algoritma yazıyorum varsayalım:
Şimditemplate <class InIt, class T>
void do_something(InIt b, InIt e, T v) {
// ...
}
, ı [b..e)
içinde v
bulmak gibi basit bir şey yapmak istiyorum diyelim. b
ve e
, std::vector
üzerindeki yineleyiciler ise, if (*b == v) ...
'u kullanabilirim. Bununla birlikte, b
ve e
'un std::map
üzerinden yineleyiciler olduğunu varsayalım. Bu durumda, yalnızca anahtarını anahtarıyla karşılaştırınız, haritadaki değerlerin tamamını değil.
Soru şu ki, bu yineleyiciler haritaya verildiğinde, o haritanın yalnızca tuşları karşılaştıracak karşılaştırma işlevini nasıl alırım? Aynı zamanda, map
ile çalıştığımı da körü körüne söylemek istemiyorum. Örneğin, yineleyiciler bir set
işaret ettiyse, o set
için tanımlanan karşılaştırma işlevini kullanmak isterim. Bir vector
veya deque
işaret ettiyseler, muhtemelen ==
kullanmam gerekir, çünkü bu kapsayıcıların tanımlı bir karşılaştırma işlevi yoktur.
Ah, neredeyse unuttum: Ben birçok durumda, bir kap sadece içerdiği elementler için operator<
yerine operator==
bir eşdeğer olacaktır fark - Bunu kullanmak mümkün olan gayet de değilim.
Hiçbir zaman elimizde bir cevap yazmak için ama bu http://en.cppreference.com/w/cpp/container/map/key_comp yardımcı olabilir. Hmm, çok değil. Zor kısmı konteyneri alıyor. –
"set" durumunuz için kafam karıştı. Bir 'set'in karşılaştırıcısının, 'operatör ==' için geçerli olmayan toplam sıra olması gerekir. – pmr
Bir harita girişinin anahtarını yalnızca veya tüm girişle karşılaştırırsanız, aynı şey aynı değil mi? [Düzenle] Tabii ki boş değil - haritalanmış kısımda eşitlik işleminiz olmayabilir. –