Dato un iteratore, è possibile recuperare/utilizzare la funzione di confronto corretta per la raccolta a cui si riferisce questo iteratore?Richiamare la funzione di confronto del contenitore dato un iteratore
Per esempio, supponiamo che sto scrivendo un algoritmo generico:
template <class InIt, class T>
void do_something(InIt b, InIt e, T v) {
// ...
}
Ora, diciamo che voglio fare qualcosa di semplice, come trovare v
in [b..e)
. Se b
e e
sono iteratori su un std::vector
, posso semplicemente usare if (*b == v) ...
. Supponiamo, tuttavia, che b
e e
siano iteratori su un std::map
. In questo caso, I dovrebbe solo confrontare le chiavi , non l'intero valore di ciò che è contenuto nella mappa.
Quindi la domanda è, dati quegli iteratori sulla mappa, come faccio a recuperare la funzione di confronto di quella mappa che confronta solo le chiavi? Allo stesso tempo, non voglio credere ciecamente che sto lavorando con uno map
. Ad esempio, se gli iteratori puntano a un set
, vorrei utilizzare la funzione di confronto definita per tale set
. Se hanno indicato un vector
o deque
, probabilmente dovrei usare ==
, perché quei contenitori non avranno una funzione di confronto definita.
Oh, quasi dimenticato: mi rendo conto che in molti casi, un container avrà solo un equivalente di operator<
anziché operator==
per gli elementi in esso contenuti - Sto perfettamente bene con l'essere in grado di usarlo.
Non c'è tempo per scrivere una risposta in questo momento, ma questo potrebbe aiutare http://en.cppreference.com/w/cpp/container/map/key_comp. Hmm, non molto, però. La parte difficile è ottenere il contenitore. –
Sono confuso per il tuo caso 'set'. Il comparatore di un 'set' deve essere un ordine totale, che non è il caso di' operator == '. – pmr
Non è lo stesso, sia che si confronti solo la chiave di una voce della mappa o l'intera voce? [Modifica] Non importa, ovviamente non lo è - potresti non avere un'operazione di uguaglianza sulla parte mappata. –