come ottenere la chiave casuale per std :: map in C++? usando l'iteratore? Non desidero mantenere la struttura dati aggiuntivarecupera l'elemento chiave casuale per std :: map in C++
risposta
std::map
Gli iteratori sono bidirezionali, il che significa che la selezione di una chiave casuale sarà O(n)
. Senza utilizzare un'altra struttura dati, in pratica l'unica scelta è quella di utilizzare std::advance
con un incremento casuale da begin()
. Per esempio:
std::map<K, V> m;
auto it = m.begin();
std::advance(it, rand() % m.size());
K random_key = it->first;
(o sostituendo rand()
con (per esempio) std::mt19939
se si ha accesso a <random>
).
Dipende da cosa è casuale per il tuo scopo. std::map
è un contenitore ordinato, ma non supporta l'accesso casuale per numero di elemento. Detto questo e la conoscenza del set di chiavi, puoi selezionare casualmente un punto in cui scavare nella mappa usando lower_bound
o upper_bound
per trovare un elemento vicino a questo. Questo ha la tendenza a mantenere gli elementi di prelievo in base al divario tra loro e altri elementi nella mappa, il che significa che mentre il risultato iniziale può essere considerato efficacemente casuale se gli elementi/intervalli sono essi stessi effettivamente casuali, la selezione ripetuta di elementi casuali non sarà distribuito uniformemente.
Ad esempio, diciamo che le vostre chiavi erano lettere maiuscole e che i tasti "C", "O", "Q" e "S" erano nella mappa. Se generi una lettera casuale dall'AZ, avresti molta più probabilità di finire su C, O o S rispetto a Q, dato che solo PQR sono vicini a Q e usando il limite superiore o inferiore avresti finito per selezionarne due, quindi 2/26 possibilità nonostante ci siano solo 4 elementi. Tuttavia, se all'inizio vi fosse una certa casualità nella selezione di C, O, Q e S, si potrebbe obiettare che le lacune e le scelte sono casuali.
Si potrebbe migliorare un po 'accoltellando nel contenitore in questo modo, quindi facendo un piccolo numero casuale di incrementi/decrementi dell'iteratore, ma non sarebbe ancora casuale.
Un risultato veramente casuale richiede l'avanzamento di una traversata uno alla volta attraverso l'elenco o il contenitore di indicizzazione secondario che si desidera evitare.
- 1. std :: map con std :: chiave weak_ptr
- 2. di riferimento come chiave per std :: map
- 3. Come usare NSString come chiave in Objective-C++ std :: map
- 4. Utilizzo di std :: reference_wrapper come chiave in una std :: map
- 5. Recupera coords per google map
- 6. std :: map ordina per dati?
- 7. C++: Ereditato da std :: map
- 8. Porting std :: map to C?
- 9. Copia std :: map in std :: set in C++
- 10. Usa std :: reference_wrapper in std :: map
- 11. Utilizzo di char * come chiave in std :: map, come funziona
- 12. C++ - std :: wstring a std :: string - conversione rapida e sporca da utilizzare come chiave in std :: map
- 13. Recupera chiave/valore proprietà
- 14. C++ std :: map domanda sull'ordine iteratore
- 15. std :: map valore predefinito per le enumerazioni
- 16. Mappatura std :: map a Python
- 17. Quando scegliere std :: vector su std :: map per i dati valore-chiave?
- 18. Perché può usare const char * come chiave per std :: map <std :: string, int>
- 19. Doxygen riconosce std :: shared_ptr o std :: map
- 20. C++ value_type non funzionare per std :: tr1: tupla in uno std :: map
- 21. E 'sicuro usare un weak_ptr in uno std :: set o la chiave di std :: map
- 22. Requisito dell'operatore di assegnazione per il tipo di chiave in std :: map
- 23. Copia/sposta i requisiti per i tipi di chiave/valore in una std :: map?
- 24. std :: map thread-safety
- 25. C++ Memorizzare i riferimenti ai valori in std :: map
- 26. Esiste un equivalente keySet() di Java Map per la std :: map di C++?
- 27. Scelta tra std :: map e std :: unordered_map
- 28. Utilizzo di std shared_ptr come std :: map key
- 29. C++ std :: map <std :: string, int> valori ottenere che cominciano chiave con una particolare stringa
- 30. Assegnare valori multipli a std :: array in std :: map
Ora c'è 'std :: next'. :) – erip