#include <iostream>
#include <vector>
#include <map>
#include <cstdlib>
std::vector<int> generate_numbers(int amount, int max_num)
{
std::vector<int> numbers(amount);
for (int i = 0; i < amount; ++i) {
numbers[i] = rand() % max_num + 1;
}
return numbers;
}
std::map<int, int> count_numbers(const std::vector<int> &numbers)
{
// Count numbers
std::map<int, int> counts; // We will store the count in a map for fast lookup (C++11's unordered_map has even faster lookup)
for (size_t i = 0; i < numbers.size(); ++i) { // For each number
counts[numbers[i]]++; // Add 1 to its count
}
return counts;
}
void print_counts(const std::map<int, int> &counts)
{
for(std::map<int, int>::const_iterator it = counts.begin();
it != counts.end();
++it) { // For each number stored in the map (this automatically filters those with count 0)
std::cout << it->first << ": " << it->second << std::endl; // Output its count
}
}
int main() {
srand(0); // So that we get the same result every time
std::vector<int> numbers = generate_numbers(10000, 500);
std::map<int, int> counts = count_numbers(numbers);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWFwPgojaW5jbHVkZSA8Y3N0ZGxpYj4KCnN0ZDo6dmVjdG9yPGludD4gZ2VuZXJhdGVfbnVtYmVycyhpbnQgYW1vdW50LCBpbnQgbWF4X251bSkKewoJc3RkOjp2ZWN0b3I8aW50PiBudW1iZXJzKGFtb3VudCk7Cglmb3IgKGludCBpID0gMDsgaSA8IGFtb3VudDsgKytpKSB7CgkJbnVtYmVyc1tpXSA9IHJhbmQoKSAlIG1heF9udW0gKyAxOwoJfQoJcmV0dXJuIG51bWJlcnM7Cn0KCnN0ZDo6bWFwPGludCwgaW50PiBjb3VudF9udW1iZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4gJm51bWJlcnMpCnsKCS8vIENvdW50IG51bWJlcnMKCXN0ZDo6bWFwPGludCwgaW50PiBjb3VudHM7IC8vIFdlIHdpbGwgc3RvcmUgdGhlIGNvdW50IGluIGEgbWFwIGZvciBmYXN0IGxvb2t1cCAoQysrMTEncyB1bm9yZGVyZWRfbWFwIGhhcyBldmVuIGZhc3RlciBsb29rdXApCglmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWJlcnMuc2l6ZSgpOyArK2kpIHsgLy8gRm9yIGVhY2ggbnVtYmVyCgkJY291bnRzW251bWJlcnNbaV1dKys7IC8vIEFkZCAxIHRvIGl0cyBjb3VudAoJfQoJcmV0dXJuIGNvdW50czsKfQoKdm9pZCBwcmludF9jb3VudHMoY29uc3Qgc3RkOjptYXA8aW50LCBpbnQ+ICZjb3VudHMpCnsKCWZvcihzdGQ6Om1hcDxpbnQsIGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY291bnRzLmJlZ2luKCk7CglpdCAhPSBjb3VudHMuZW5kKCk7CgkrK2l0KSB7IC8vIEZvciBlYWNoIG51bWJlciBzdG9yZWQgaW4gdGhlIG1hcCAodGhpcyBhdXRvbWF0aWNhbGx5IGZpbHRlcnMgdGhvc2Ugd2l0aCBjb3VudCAwKQoJCXN0ZDo6Y291dCA8PCBpdC0+Zmlyc3QgPDwgIjogIiA8PCBpdC0+c2Vjb25kIDw8IHN0ZDo6ZW5kbDsgLy8gT3V0cHV0IGl0cyBjb3VudAoJfQp9CgppbnQgbWFpbigpIHsKCXNyYW5kKDApOyAvLyBTbyB0aGF0IHdlIGdldCB0aGUgc2FtZSByZXN1bHQgZXZlcnkgdGltZQoJc3RkOjp2ZWN0b3I8aW50PiBudW1iZXJzID0gZ2VuZXJhdGVfbnVtYmVycygxMDAwMCwgNTAwKTsKCXN0ZDo6bWFwPGludCwgaW50PiBjb3VudHMgPSBjb3VudF9udW1iZXJzKG51bWJlcnMpOwoJcmV0dXJuIDA7Cn0=