Prikaz jedne poruke
Stara 23.9.2012, 21:54   #121
Belphegor
V.I.P. Programiranje
 
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
Određen forumom Re: How to... C++

@Ivan

Ok. Mada mislim da je kod ocigledan.

Kod:
class random
...
Dosadile mi srand i rand funkcije, a rek'o i da probam ovaj Mersenne Twister generator pa sam to lepo spakovao u klasu.
Klasa ima templejt metodu get overload-ovanu da bih u zavisnosti od tipa argumenata koristio odgovarajuce "distribucije".
Znaci samo integral i floating-point tipovi dolaze u obzir sve ostalo je compile time error.

http://en.cppreference.com/w/cpp/num...t_distribution

Kod:
typedef std::pair<std::size_t, std::size_t> tpnum;
    std::vector<tpnum> numbers;
Imam vektor parova gde prvi element (first) oznacava koliko puta se ponovio neki broj i drugi element (second) oznacava sam taj broj.

Kod:
numbers.resize(N);

        std::for_each(std::begin(numbers), std::end(numbers), [](tpnum& e){
            e = std::make_pair(0u, random::get(0u, 100u));
        });
Prosirujem vektor na velicinu N (koliko brojeva se izvlaci) i inicijalizujem ga. first = 0, second = random 0 - 100.

Kod:
for(auto& it : numbers)
        {
            it.first = std::count_if(std::begin(numbers), std::end(numbers), [&it](const tpnum& e){
                return it.second == e.second;
            });
        }
Broji koliko se koji element ponavlja (tu su i "duplikati") i cuvam tu vrednost za svaki.

Kod:
std::sort(std::begin(numbers), std::end(numbers), [](const tpnum& l, const tpnum& r){
            return l.second > r.second;
        });
Soriram po random brojevima koji su izvuceni da bih u sledecem koraku imao vektor spreman za unique-ifikaciju (std::unique).

Kod:
auto end = std::unique(std::begin(numbers), std::end(numbers), [](const tpnum& l, const tpnum& r){
            return l.second == r.second;
        });
Pozivam std::unique algo i cuvam end iterator da bih znao gde je kraj unikatima.

Kod:
std::sort(std::begin(numbers), end, [](const tpnum& l, const tpnum& r){
            return l.first > r.first;
        });
Sortiram ponovo da bih dobio elemente koje se najvise ponavljaju prvo. Od pocetka do elementa gde pokazuje end iterator.

I na kraju ispisujem prvih F elemenata. Mada moze da se desi da broj unikata bude manji od F-a ali nece fejlovati.
Belphegor je offline   Odgovor sa citatom ove poruke