No, non è possibile. Il comparatore fa parte del tipo della mappa. La domanda non è diversa dal chiedere se è possibile modificare uno int
per memorizzare numeri in virgola mobile.
Ancora più importante, l'ordine fornito dal comparatore è parte integrante della struttura interna della mappa. Se si dovesse modificare l'ordine, la struttura dei dati non sarebbe più in uno stato coerente.L'unica opzione fattibile è quella di ricostruire una nuova mappa da elementi del vecchio mappa rispetto al nuovo ordine, ma questo è già possibile:
std::map<T, V, Comp1> m1 = /* ... */;
std::map<T, V, Comp2> m2(m1.begin(), m1.end());
In alternativa, è possibile effettuare una seconda mappa di tipo std::map<std::reference_wrapper<T const>, std::reference_wrapper<V>, Comp2>
e popolarlo con riferimenti alla mappa originale, ma ordinati in base a Comp2
. In tal caso è responsabilità dell'utente mantenere sincronizzate le due mappe. Un contenitore avanzato come Boost.Multiindex può farlo per te in modo sicuro.
fonte
2012-12-18 15:00:29
Vedete una funzione qui per consentirvi di farlo direttamente: http://en.cppreference.com/w/cpp/container/map? In caso contrario, la risposta è no ... – Nim
È un parametro template, quindi deve essere corretto in fase di compilazione. Modificarlo cambierebbe il tipo del contenitore. – v154c1