C++11 lambdat: [](){} Matti Rintala

Samankaltaiset tiedostot
TIE Ohjelmistojen suunnittelu

TIE Ohjelmistojen suunnittelu

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Osoitin ja viittaus C++:ssa

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Metaohjelmointia ja muuta hauskaa

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

ITKP102 Ohjelmointi 1 (6 op)

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Olio-ohjelmointi Syntaksikokoelma

7. Oliot ja viitteet 7.1

ITKP102 Ohjelmointi 1 (6 op)

12 Mallit (Templates)

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Metodien tekeminen Javalla

ITKP102 Ohjelmointi 1 (6 op)

Demo 6 vastauksia. 1. tehtävä. #ifndef #define D6T1 H D6T1 H. #include <iostream> using std::ostream; using std::cout; using std::endl;

STL:n uudistukset. Seppo Koivisto TTY Ohjelmistotekniikka

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Lyhyt kertaus osoittimista

Sisältö. 2. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Osoittimet ja taulukot

11/20: Konepelti auki

Tietueet. Tietueiden määrittely

Ohjelmointiharjoituksia Arduino-ympäristössä

Operaattoreiden uudelleenmäärittely

815338A Ohjelmointikielten periaatteet

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Sisältö. 22. Taulukot. Yleistä. Yleistä

Olio-ohjelmointi 2. välikoe HYV5SN

TIE Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua

Java-kielen perusteet

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Luento 4 Aliohjelmien toteutus

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

4. Luokan testaus ja käyttö olion kautta 4.1

Rajapinta (interface)

1. Omat operaatiot 1.1

Funktiomallit Funktiomallin määrittely

Olio-ohjelmointi Javalla

Ohjelmoinnin peruskurssien laaja oppimäärä

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

Virtuaalifunktiot ja polymorfismi

Algoritmit 2. Luento 7 Ti Timo Männikkö

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

ITKP102 Ohjelmointi 1 (6 op)

TIE Ohjelmistojen suunnittelu. Kopiointia ja sijoittelua

Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Ohjelmointi 1 Taulukot ja merkkijonot

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi

tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi

Jakso 4 Aliohjelmien toteutus

5/20: Algoritmirakenteita III

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Ohjelman virheet ja poikkeusten käsittely

14. Poikkeukset 14.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Listarakenne (ArrayList-luokka)

Luokan operaatiot. Osoittimet ja viittaukset luokan olioihin

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

Monipuolinen esimerkki

Java-kielen perusteet

Jakso 4 Aliohjelmien toteutus

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

TIE Tietorakenteet ja algoritmit 25

Luento 4 (verkkoluento 4) Aliohjelmien toteutus

Tutoriaaliläsnäoloista

11. Javan valintarakenteet 11.1

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Algoritmit 1. Luento 1 Ti Timo Männikkö

7/20: Paketti kasassa ensimmäistä kertaa

List-luokan soveltamista. Listaan lisääminen Listan läpikäynti Listasta etsiminen Listan sisällön muuttaminen Listasta poistaminen Listan kopioiminen

811120P Diskreetit rakenteet

14. oppitunti. Operaattorin ylikuormitus. Osa. Operaattorin ylikuormittaminen

Jakso 4 Aliohjelmien toteutus

Javan perusteita. Janne Käki

Taulukot. Jukka Harju, Jukka Juslin

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

14. Poikkeukset 14.1

12. Javan toistorakenteet 12.1

13 Operaattoreiden ylimäärittelyjä

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Standardi mallikirjasto

12. Javan toistorakenteet 12.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

19. Olio-ohjelmointia Javalla 19.1

Transkriptio:

C++11 lambdat: [](){} Matti Rintala

bool(*)(int) Tarve Tarve välittää kirjastolle/funktiolle toiminnallisuutta Callback-funktiot Virhekäsittely Käyttöliittymät Geneeristen kirjastojen räätälöinti STL:n algoritmit (sort, find_if,...) Koodin rinnakkainen suoritus Aiempi tapa funktio-osoittimilla ja C++03:n (kömpelöillä) funktio-olioilla

bool(*)(int) Funktio-osoittimien rajoitukset Funktio-osoittimet ovat "funktionaalisia" Parametrit ainoa data sisään, viiteparametrit+paluuarvo ulos void alle5(int a) { return a < 5; } std::find_if(v.begin(), v.end(), &alle5); Muun datan välitys funktioon/-sta vaikeaa (lähinnä globaalit muuttujat) Korostuu esim. callback-funktioissa int raja; // Oltava globaali muuttuja! void allerajan(int a) { return a < raja; } std::cin >> raja; std::find_if(v.begin(), v.end(), &allerajan);

(lambda (x) (x x)) Lambdat Lambdat ikivanha keksintö (Lisp) C++11:n lambdoissa kuitenkin joitain eroja Idea: Lambdat ovat funktion kaltaisia tuotteita, ottavat parametreja, palauttavat paluuarvon nimettömiä, määrittelemättömän tyyppisiä (melkein) pystyvät viittaamaan luontiympäristönsä muuttujiin, samoin muuttamaan pystyvät kopioimaan itseensä osia luontiympäristöstään

[](){} Syntaksi Lambdojen syntaksi C++11:ssa [ympäristö](parametrit)->paluutyyppi { runko; } ympäristö tyhjä, jos ei viittaa ympäristöönsä parametrit tyhjä, jos ei parametreja (myös () voi puuttua) jos ->paluutyyppi puuttuu, se on void, paitsi jos runko pelkkä return-lause, jolloin päätellään std::find_if(v.begin(), v.end(), [](int a){return a<5;} ); int raja; // Paikallinen muuttuja std::cin >> raja; std:find_if(v.begin(), v.end(), [raja](int a){return a<raja;} );

[](){} Ympäristöön viittaaminen Lambda voi viitata paikallisiin muuttujiin: lambdan elinaika vs muuttujan elinaika! C++:n ongelma, muuttujilla määrätty elinaika (C++:n muistimalli) Toinen tapa ajatella: lambda saa parametreja ympäristöstään luontihetkellä, normaalit parametrit kutsuhetkellä Kaksi tapaa: arvon ja viitteen välitys

[=](){} Ympäristön kopioiminen Tapa 1: ympäristön kopioiminen = (oletus) Käytetyt muuttujat kopioidaan lambdan sisään (vrt. arvoparametri), elinkaaret eivät ongelma Kopioita voi muuttaa vain, jos lambda on mutable int raja; std::cin >> raja; std::find_if(v.begin(), v.end(), [=raja](int a){return a<raja;} ); std::for_each(v.begin(), v.end(), [raja](int a) mutable { std::cout << + +raja; } );

[&](){} Ympäristöön viittaaminen Tapa 2: Ympäristöön viittaaminen & Lambda käyttää suoraan ympäristön muuttujia Ohjelmoija vastaa, että muuttujat pysyvät elossa int summa = 0; std::for_each(v.begin(), v.end(), [&summa](int a){summa += a;} );

[=a,&](){} Ympäristöön viittaaminen Ympäristöön viittauksia voi yhdistellä int raja = 5; int vertailuja = 0; std::find_if(v.begin(), v.end(), [=raja,&vertailuja](int a)->bool { ++vertailuja; return a<raja; } ); Implisiittinen ympäristöön viittaus (valittava, onko viite vai kopio) int raja = 5; int summa = 0; std::find_if(v.begin(), v.end(), [=](int a){return a<raja;} ); std::for_each(v.begin(), v.end(), [&](int a){summa+=a;} );

[this](){} Ympäristöön viittaaminen Jäsenfunktiossa määritelty lambda voi viitata jäsenmuuttujiin ja -funktioihin class X { int i_; void g(int x); void f(std::vector<int> const& v) { std::for_each(v.begin(), v.end(), [this](int a){ i_+=a; g(a); } ); } };

decltype([](){}) Lambdojen tyyppi Lambda sisältää dataa, ei voi olla normaali funktio Lambdan tyyppi määrittelemätön Lambdan ottavan funktion oltava käytännössä template, jossa parametrityyppi avoin Jos lambda ei viittaa ympäristöönsä, siitä on tyyppimuunnos normaaliin funktio-osoittimeen (välitys vanhaan koodiin) Lambdan välitys ei-templatelle: std::function<>

sizeof([](){}) Sisäinen toteutus Yksi mahdollisuus: lambdat funktio-olioita Nimettömiä luokkia, joissa kutsuoperaattori operator() Jäsenmuuttuja jokaista ympäristöviittausta kohti (viite, jos viittaus ympäristöön) Kääntäjä saa myös toteuttaa miten haluaa Esim. funktio-olio, jossa suoraan aktivaatiotietueen osoite yms.

auto f =[](){}; Esimerkkejä STL:n käyttö std::transform(std::istream_iterator<int>(cin), std::istream_iterator<int>(), std::ostream_iterator<int>(cout,'\n'), [](int a){ return a*a; } ); int i=0; std::generate_n(back_inserter(v), 10, [&](){ return ++i; } ); Rinnakkaisuus std::future<int> t = std::async([](){...}); std::thread t([](){...});

auto f =[](){}; Esimerkkejä Callback-funktiot // Funktio-osoitin, ympäristöön ei viitata on_event(type, void(*)()); on_event(left_click, []{cout<<"painettu";} ); template<typename T> on_event(type, T); on_event(left_click, [&]{nappi=true;} ); on_event(type, function<int()>); on_event(left_click, [&]{nappi=true;} );

auto f =[](){}; Esimerkkejä Paikalliset funktiot void f(std::vector<int>& v, std::list<int>& l) { int x=1; auto kerro = [&](int i){x *= i;}; for (auto i: v) { kerro(i); } for (auto i: l) { kerro(i); } }

auto f =[](){}; Esimerkkejä Nimetyt silmukat for, while eivät kerro, miksi silmukka suoritetaan STL:n algoritmeja voi ajatella nimettyinä erityissilmukoina, joilla lambda runkona Vertaa: bool kaikki = true; for (auto i : v) { if (i%10!= 0) { kaikki = false; break; } } if (kaikki) {...} if (std::all_of(v.begin(), v.end(), [](int i){return i%10==0;}){...}

[a](b){c;} Tulevaisuus Polymorfinen lambda Lambda, parametrien tyyppejä ei määrätty Parametrityypit määräytyvät kutsuttaessa Vrt. template-funktio Toteutus funktio-oliona, jonka operator() template Syntaksi vielä auki (seuraava C++-päivitys?) std::vector<int> vi; std::vector<float> vf; float summa = 0.0; auto summaa = [&](a){summa+=a;}; std::for_each(vi.begin(), vi.end(), summaa); std::for_each(vf.begin(), vf.end(), summaa);