Ik heb een unordered_map met meer dan 50 elementen en wil daar willekeurig 50 elementen uithalen. Hoe doe ik dit het beste?
Performance is belangrijk, de grootte van de containers ligt tussen de 0 en 10000 elementen en het trucje moet tot 10000x per seconde herhaalt worden.
Momenteel kopieër ik de elementen naar een vector en haal daar dan 50 elementen uit maar dat is niet echt efficient.
Oh ja, in sommige gevallen wordt de input container nog gefilterd, dus dan doen niet alle elementen mee.
Ik zou 50 random indexes in een vector kunnen stoppen, die sorteren en dan de originele unordered_map uitlezen maar weet niet of dat veel beter is en of het nog beter kan.
Het type van de elementen is std::array<char, 6> om het wat makkelijker te maken.
Het is een IP adres / port combi.
Performance is belangrijk, de grootte van de containers ligt tussen de 0 en 10000 elementen en het trucje moet tot 10000x per seconde herhaalt worden.
Momenteel kopieër ik de elementen naar een vector en haal daar dan 50 elementen uit maar dat is niet echt efficient.
Oh ja, in sommige gevallen wordt de input container nog gefilterd, dus dan doen niet alle elementen mee.
Ik zou 50 random indexes in een vector kunnen stoppen, die sorteren en dan de originele unordered_map uitlezen maar weet niet of dat veel beter is en of het nog beter kan.
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| std::vector<std::array<char, 6>> candidates; candidates.reserve(peers.size()); // populate candidates from unordered_map size_t c = 50; std::string d; d.reserve(300); if (candidates.size() > c) { while (c--) { int i = rand() % candidates.size(); d.append(candidates[i].begin(), candidates[i].end()); candidates[i] = candidates.back(); candidates.pop_back(); } } else { for (auto& i : candidates) d.append(i.begin(), i.end()); } return d; |
Het type van de elementen is std::array<char, 6> om het wat makkelijker te maken.
Het is een IP adres / port combi.
[ Voor 5% gewijzigd door Olaf van der Spek op 06-03-2015 12:03 ]