C++11 - sekalaista Roope Hakulinen 25.5.2012
Sisältö Tuplet Käännösaikaiset murtoluvut Satunnaislukugeneraattorit Aika
Tuplet - yleistä Parin yleistys useammalle elementille Ikään kuin struct, mutta indeksointi järjestysnumerolla nimen sijaan Kaikki tyypit (ml. viittaukset, osoittimet) käyvät elementeiksi
Tuplet - käyttö Luominen: tuple<int, double, string> t1(2, 4.3, tuple ); auto t2 = make_tuple( tuple, Oma(), 4); int a = 0; double b = 4.0; auto t3 = tie(a, b); // Viitteitä Käyttö: int a = get<0>(t1); get<2>(t2) = 16; Myös vertailu (niin kuin pareilla): make_tuple(16, 2.0) > make_tuple(-4, 0.5) // true
Tuplet - käyttökohteita Usean paluuarvon välitysfunktiosta tuple<int, int> koordinaatti = palautakoord();
Käännösaikaiset murtoluvut Luokka ratio<> käännösaikaisten murtolukujen kanssa operoimiseen Käännösaikana huomataan nollalla jaot, ylivuodot ym. virheet Osaa perusaritmetiikan (+, -, *, /) ja vertailun lisäksi supistaa murtoluvut
Ratio<> - käyttö #include <ratio> std::ratio<5, 3> a; std::ratio<6, 4> b; auto c = std::ratio_multiply<a, b>; cout << c::num << / << c::den; // 5/2 std::ratio<5, 0> c; // Käännösvirhe
Satunnaislukugeneraattorit Engine: stateful source of random Distribution: muuntaa enginen antamat arvot satunnaisluvuiksi jakaumansa mukaisesti Enginen arvoja ei tule käyttää suoraan, sillä ne ovat deterministisessä järjestyksessä
Enginet Tilallinen moottori numeroiden tuottamiseen Eroavat tehokkuudessa, laadussa ja palauttamiensa arvojen tyypissä (int/float) Kolme perusmoottoria, lisäksi useita adaptereita (voi käyttää myös default_random_engine) Tuottavat samat arvot kaikilla alustoilla (pl. default_random_engine, joka on alustasta riippuen joku moottoreista) Engine Integer/floating point Laatu Tehokkuus Tilan koko linear_congruential Integer Kesk. Kesk. 1 subtract_with_carry molemmat Kesk. Nopea 25 mersenne_twister Integer Hyvä Nopea 624
Enginet - käyttö #include <random> std::default_random_engine dre; int i = dre(); // Luetaan seuraava arvo dre.discard(2); // Hypätään kahden arvon yli dre.seekg(0); // Siirrytään alkuun std::default_random_engine dre2; int j = dre2(); // i == j bool sama_tila = (dre == dre2); // true std::default_random_engine dre3(5); // Aloitetaan tilasta 5
Engine-adapterit Valmiiksi määriteltyjä adaptereita engineille Kolme: discard_block_engine, independent_bits_engine ja shuffle_order_engine Esimerkiksi discard_block_engine jättää välistä parametrina annetun määrän arvoja Lisäksi adaptereita valmiiksi määritellyillä parametreillä knuth_b = shuffle_order_engine<linear_congruential_engine<uint_fast_32, 16807, 256> 0, 2147483647>,
Distributionit Käytetään enginen arvojen muuttamiseksi (pseudo)satunnaisluvuiksi Valmiiksi tarjolla 20 jakaumaa (normaali-, geometrinen, Bernoullin, Poissonin jakauma jne.)
Distributionit - käyttö #include <random> std::default_random_engine engine; std::uniform_int_distribution<> d(0, 10); int i = d(engine); int minimi = d.min(); // 0 int maksimi = d.max(); // 10
Ajan käsittely Aikaisemmin C:ssä ollaan luotu uusi rajapinta aina, kun kellojen tarkkuus on kasvanut (s ms us ns) Tämän välttämiseksi luotiin uusi kirjasto, chrono, jossa aikaa käsitellään eri tavalla Timepoint = alkuhetki + kesto Määritelty std::chrono-nimiavaruudessa
Ajan käsittely - duration Duration koostuu tickeistä ja suhteesta Suhde ilmaistaan uuden ratio-luokan avulla Esim. std::chrono::duration<1, ratio<1,3>> d1(1); // Yksi kolmasosa sekunti Myös valmiiksi määriteltynä eri perusyksiköt : typedef duration<signed int-type >= 64 bits, ratio<1, 10^(-9)>> nanoseconds; std::chrono::nanoseconds ns(100); // 100 nanosekuntia Kaikki aritmeettiset operaatiot (+, -, *, /, %, ++) sekä vertailut määriteltynä Kaventava muunnos esimerkiksi sekunneista minuuteiksi ei onnistu implisiittisesti duration_cast<>
Ajan käsittely timepoint Kello määrittelee alkuhetken ja tick-jakson Timepoint määritellään kellon ja durationin avulla Std::chrono::time_point<kello, duration> Kolme kelloa: system_clock Järjestelmän reaaliaikakello steady_clock Kello, jota ei koskaan siirretä high_resolution_clock Mahdollisimman tarkka kello Ajan haku: chrono::time_point tp = chrono::system_clock::now();