jak uzyskać losowy klucz dla std :: map w C++? używając iteratora? Nie chcę, aby dodatkowa struktura danych była obsługiwana.pobierz losowy element klucza dla std :: map w C++
Odpowiedz
std::map
Iteratory są dwukierunkowe, co oznacza, że wybranie losowego klucza będzie miało postać O(n)
. Bez użycia innej struktury danych, zasadniczo jedynym wyborem jest użycie std::advance
z losowym przyrostem z begin()
. Na przykład:
std::map<K, V> m;
auto it = m.begin();
std::advance(it, rand() % m.size());
K random_key = it->first;
(lub wymieniając rand()
z (na przykład) std::mt19939
jeśli masz dostęp do <random>
).
Zależy od tego, co jest losowe dla Twojego celu. std::map
to posortowany kontener, ale nie obsługuje dostępu losowego według numeru elementu. Biorąc to pod uwagę i wiedzę o zestawie kluczy, możesz losowo wybrać punkt, w którym chcesz zagłębić się w mapę, używając lower_bound
lub upper_bound
, aby znaleźć element w pobliżu. Ma to skłonność do utrzymywania elementów zbioru w oparciu o lukę między nimi a innymi elementami na mapie, co oznacza, że początkowy wynik może być uważany za efektywny losowo, jeśli same elementy/luki są faktycznie przypadkowe, powtarzalny wybór losowych elementów nie będzie równomiernie.
Na przykład, powiedzmy, że twoje klucze były dużymi literami, a klawisze "C", "O", "Q" i "S" były na mapie. Jeśli wygenerujesz losową literę od AZ, będziesz bardziej prawdopodobne, że skończysz na C, O lub S niż Q, ponieważ tylko PQR znajduje się w pobliżu Q i używa górnej lub dolnej granicy, którą wybierzesz wybierając dwie z nich, więc szansa 2/26, mimo że są tylko 4 elementy. Mimo to, gdyby na początku była losowość wyboru C, O, Q i S, można by argumentować, że luki i wybór są przypadkowe.
Możesz trochę poprawić, dźgając w taki pojemnik, a następnie wykonując małą losową liczbę przyrostów/deklinacji iteratora, ale nadal nie będzie to naprawdę losowe.
Prawdziwie losowy wynik wymaga przechodzenia jeden po drugim przez listę lub dodatkowego zasobnika indeksującego, którego chcesz uniknąć.
- 1. Pobierz losowy element z C# HashSet szybko
- 2. Używanie std :: reference_wrapper jako klucza w std :: map
- 3. Pobierz losowy element i usuń go.
- 4. Używanie std :: string jako klucza do std :: map
- 5. Trwałość std :: map w C++
- 6. losowy element w numpy
- 7. C++ std Kopiowanie listę map
- 8. Losowy element mapie
- 9. Używanie char * jako klucza w std :: map, jak to działa
- 10. std :: map z std :: weak_ptr key
- 11. Pobierz bajty ze std :: string w C++
- 12. C++ std :: map lub std :: set - wydajnie wstaw duplikaty
- 13. Skopiuj std :: map do std :: set in C++
- 14. Jak działa iterator std :: map?
- 15. Usuń element ze std :: map na podstawie czasu wstawienia
- 16. Pobierz centrum w Cesium Map
- 17. Jak przekonwertować posortowane std :: lista std :: pair na std :: map
- 18. C++ const std :: map reference nie kompiluje się
- 19. Jak uzyskać losowy element w jquery?
- 20. Lokalizacja odczytu naruszenia w std :: operator map []
- 21. C++ map funkcji cmath
- 22. C++ Jak znaleźć największy klucz w std :: map?
- 23. Usuń element ith z C++ std :: vector
- 24. Jak uzyskać losowy element z zestawu w Swift?
- 25. Java Map zwraca wartość null dla klucza bieżącego
- 26. Pobierz losowy obraz PHP z folderu
- 27. Stosując (matematycznej) Wektor w std :: map
- 28. Pobierz aktualny czas w C
- 29. Decrement od końca std :: map
- 30. W jaki sposób jest wdrażana funkcja std :: map, aby wymagać, aby jej typ klucza był porównywalny?
Teraz jest 'std :: next'. :) – erip