Što služi ova funkcija?

poruka: 20
|
čitano: 2.729
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
10 godina
neaktivan
offline
Što služi ova funkcija?

Dobila sam zadatke za pripremu za jedan razgovor za posao i jedan od zadataka pita što predstavlja ova funkcija i kako se koristi?

 

X& operator = (X&& r)

{

// ?

}

 

Nikad nisam vidjela ovo s dva znaka &&. čemu to služi?

Poruka je uređivana zadnji put uto 26.8.2014 19:46 (Ivana G).
 
0 1 hvala 0
15 godina
neaktivan
offline
Što služi ova funkcija?
/dev/null
 
0 3 hvala 0
16 godina
neaktivan
offline
10 godina
neaktivan
offline
Što služi ova funkcija?

Našla sam taj link ali mi i dalje nije jasno čemu to služi u usporedi s običnim operatorom s samo jednom referencom.

 
0 1 hvala 0
16 godina
neaktivan
offline
Re: Što služi ova funkcija?

http://www.artima.com/cppsource/rvalue.html

 

Ugrubo, dozvoljava ti mjenjanje objekta dok s jednom referencom ne ide.

 

Netko  tko je malo više u c++u neka me slobodno ispravi ako blebecem

 

14 godina
neaktivan
offline
Re: Što služi ova funkcija?
Ivana G kaže...

Dobila sam zadatke za pripremu za jedan razgovor za posao i jedan od zadataka pita što predstavlja ova funkcija i kako se koristi?

 

X& operator = (X&& r)

{

// ?

}

 

Nikad nisam vidjela ovo s dva znaka &&. čemu to služi?

Zanimljivo da traže baš ovakvo što jer ovo je poprilično novo i zahtjeva dosta teoretskog poznavanja standarda. Koja tvrtka ako se smije znati?

 

Inače, ovo je operator pridruživanja s move semantikom koji kao parametar ima rvalue referencu (&&). Ovaj operator će izbjeći duboko kopiranje te "ukrasti" pokazivače iz privremenih objekata jer ti privremeni objekti ionako moraju odmah umrijeti.

 

Dr. Zoidberg kaže...

http://www.artima.com/cppsource/rvalue.html

 

Ugrubo, dozvoljava ti mjenjanje objekta dok s jednom referencom ne ide.

 

Netko  tko je malo više u c++u neka me slobodno ispravi ako blebecem

 

Može se promijeniti i s jednim & ali ovo iznimno ubrzava stvari kada se radi s privremenim objektima. 

16 godina
neaktivan
offline
Re: Što služi ova funkcija?

Ah eto došao je netko tko je puno više u c++, vrijeme je za odmor {#}

10 godina
neaktivan
offline
Što služi ova funkcija?

ne bih o tvrtci dok ne prođe natječaj {#}

 

rvalue reference? "Krađa pokazivača"? Kako obični smrtnici mogu pozvati ovaj operator?

Poruka je uređivana zadnji put uto 26.8.2014 20:28 (Ivana G).
 
0 2 hvala 0
14 godina
neaktivan
offline
Re: Što služi ova funkcija?
Ivana G kaže...

ne bih o tvrtci dok ne prođe natječaj {#}

 

rvalue reference? "Krađa pokazivača"? Kako obični smrtnici mogu pozvati ovaj operator?

 

Ah, šteta, već sam ti mislio ukrasti posao {#}

 

Rvalue vrijednosti su u pravilu privremene vrijednosti, a rvalue reference upravo reference na takve vrijednosti. Prije C++11 standarda to nije bilo moguće ali sada jest, te donosi ogromno poboljšanje u performansama.

 

Recimo da imaš sljedeću klasu:

(stil "kod" ne radi pa moram žutim markerom...)

 

class Test{

public:

   int *p;

   int vel;

   Test():vel(0){}

   Test(int n):vel(n){

     p = new int[n];

   }

   Test& operator =(const Test &t){

     // duboko kopiranje

     p = new int[t.vel];

     cout << "Duboko kopiranje\n";

   }

   ~Test(){

     delete[] p;

   }

};

 

Kada se izvrše sljedeće naredbe poziva se operator pridruživanja te se ispisuje "Duboko kopiranje":

 

Test A;

A = Test(10);  // duboko kopiranje

return 0;

 

Privremeni objekt Test(10) dinamički alocira niz od 10 elemenata. Zatim, objekt A radi to isto tj. također alocira niz od 10 elemenata pri naredbi A = Test(10) zbog dubokog kopiranja. To su ukupno dvije dinamičke alokacije i to vremenski traje.

 

Umjesto toga bilo bi zgodno da objekt A može preuzeti niz koji je već dinamički alocirao privremeni objekt Test(10) jer privremenom objektu taj niz ionako više ne treba jer će odmah umrijeti nakon naredbe A = Test(10). Znači, umjesto dvije dinamičke alokacije da se napravi samo jedna. Zato trebaš referencu na privremeni objekt tj. rvalue referencu te operator pridruživanja s rvalue referencom:

 

Test& operator =(Test &&t){

   // kopiranje prijenosom

   p = t.p;

   t.p = NULL; // privremeni objekt više nije vlasnik pokazivača

   cout << "Kopiranje prijenosom\n";

}

 

Kada staviš ovaj kod u gornju klasu izvršava se operator pridruživanja s semantikom prijenosa umjesto operatora s dubokim kopiranjem i to upravo zato jer se pridružuje privremeni objekt: Test(10). U ovoj verziji operatora pridruživanja nema dinamičke alokacije već se radi plitko kopiranje adrese ("krađa" memorije), a zatim se pokazivač privremenog objekta postavi na NULL kako njegov destruktor ne bi dealocirao memoriju. Ovaj pristup izbjegava dvije dinamičke alokacije pa tako i maksimalno poboljšava performanse programa.

 

U kombinaciji s ovim često se koristi i move konstruktor koji također koristi rvalue reference, pa si i to pogledaj jer to dvoje obično dolazi u kombinaciji.

 

Sretno, i pitaj ako ćeš što trebati, jer ovakvih (meni zanimljivijih) pitanja ionako ima rijetko na forumu {#}

Poruka je uređivana zadnji put uto 26.8.2014 21:20 (TracerCPP).
10 godina
neaktivan
offline
Što služi ova funkcija?

Ovo je već 3. forum na kojemu pokušavam saznati odgovor i napokon mi je nešto jasnije. Bilo bi super ako smijem kasnije zagnjaviti za lambda funkcije i predloške? {#}  imam tu i takvih zadataka i nije mi na prvi pogled dosta toga jasno a na faksu nismo ni drek radili od toga.

 
0 1 hvala 0
14 godina
neaktivan
offline
Re: Što služi ova funkcija?

Ne uče se ove stvari na faksu jer za to tamo nema vremena. Na faksu se uče tek osnove objektno orjentiranog programiranja, a za razumijevanje ovih C++11 proširenja te osnove prethodno treba znati (i to jako dobro). Tako primjerice za razumijevanje semantike prijenosa u našem prethodnom slučaju prvo treba znati nedostatke semantike kopiranja. Tek tada ćeš shvatiti prednosti korištenja rvalue reference, pa tako i konstrukora prijenosa i operatora pridruživanja tog tipa. Tako isto, za labmda funkcije preporučujem da prvo pogledaš funkcijske objekte i kako oni funkcioniraju. O variadic templatima (ako na njih misliš) niti ne razmišljaj ako ne razumiješ koncepte pune i djelomične specijalizacije, kao i obične variadict funkcije.

 

Sve u svemu, jako puno je toga.

16 godina
neaktivan
offline
Re: Što služi ova funkcija?
Ivana G kaže...

Ovo je već 3. forum na kojemu pokušavam saznati odgovor i napokon mi je nešto jasnije. Bilo bi super ako smijem kasnije zagnjaviti za lambda funkcije i predloške? {#}  imam tu i takvih zadataka i nije mi na prvi pogled dosta toga jasno a na faksu nismo ni drek radili od toga.

 

Samo gnjavi , vjerujem da ce i ostali kako tko ima vremena izaći u susret i pojasniti ti ono što je sporno.

Vidi niži code glede lambde i template-a (predložaka).

 

Ako što nije jasno , postaj pitanje.

Par riječi prije code-a : na prvi pogled puno stvari izgleda jako kriptirano , kao da su neke silne šifre nerazumljive ispisane pogotovo kad je riječ o templateima no takva je semantika jezika pa nakon nekog vremena stvari i napisani kod izgleda razumljivo no treba strpljenja pa neka te ne obeshrabri navedeno.

U nekoliko linija sam ti probao dati najosnovniji uvid u to što je template a što lambda.

Inače TEMPLATE-i su teška artiljerija C++-a o kojima primjerice c#  ili java mogu samo sanjati (niz je razloga zašto generici nisu niti do koljena C++ template-ima a zbog prirode navedenih jezika ne mogu nikada ni približno konkurirati C++ verziji) pa ih stoga valja jako dobro usvojiti.

 

...There are plenty of other dark corners of the C++ template system - it's an extremely powerful tool, but can be painful to think about, and sometimes hard to use - particularly when it gives you a twenty-page long error message. The C# system is much simpler - less powerful, but easier to understand and harder to abuse...

 

 

Ugodno kodiranje želim.

 

 

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;


/*
TEMPLATE ili predlozak
-- zove se template jer na mjesto type T
mozes ubaciti bilo koji type
od buit-in  (int , float , char ...)
do tvojih klasa
-- vidi nize , mozda bude jasnije ukoliko
ovo izgleda kriptirano
*/
template<class T>
class BUG
{
public:
    BUG(T id) : m_id(id) {}
    T getId()
    {
        return m_id;
    }

private:
    T m_id;
};



bool
sortfn(BUG<int> a, BUG<int> b)
{
    return (a.getId() < b.getId()) ? true : false;
}

/*pomocna funkcija da stalno ne ispisujemo
jedan te isti loop kroz kontejner*/
void
log(vector< BUG<int> > vec)
{
    cout<< "\n";
    for(auto x : vec)
        cout<< "value : " << x.getId() << endl;
}

int main()
{
    /*napunimo kontejner nekim vrijednostima
    , uzimamo int no mogao je biti double , unsigned int ,
    short , ... -> znaci startamo s <int>*/
    vector< BUG<int> > vec;
    vec.push_back(BUG<int>(5));
    vec.push_back(BUG<int>(1));
    vec.push_back(BUG<int>(2));
    vec.push_back(BUG<int>(4));
    vec.push_back(BUG<int>(3));


    /* old school -> preko function pointera
    generiras rezultate (fn ptr sortfn)
    nedostatak ovog pristupa je taj sto funkciju
    sortfn moras definirati van main-a*/

    sort(vec.begin(),vec.end(),sortfn);
    log(vec);


     /*idemo promijesati kontejner na slucajne vrijednosti
     kako bi ga ponovo sortirali*/

    random_shuffle(vec.begin(),vec.end());
    log(vec);



    /* lambda school -> isto ovo gore samo preko
    lambde ili drugim rijecima anonimne funkcije
    koja je definirana u samoj pozivajucoj funkciji
    , u ovom slucaju std::sort (#include <algorithm>)*/

    sort(vec.begin(),vec.end(),
         [](BUG<int> a , BUG<int> b)
    {   /*sad smo u lambdi
        kompajliraj s c++11 podrskom*/
        return (a.getId() < b.getId());
    }
    );

    log(vec);



    return 0;
}

moje aplikacije na play-u : https://play.google.com/store/search?q=nik02droid
Poruka je uređivana zadnji put sri 27.8.2014 8:56 (nik_02).
17 godina
neaktivan
offline
Re: Što služi ova funkcija?
TracerCPP kaže...

Test& operator =(Test &&t){

   // kopiranje prijenosom

   p = t.p;

   t.p = NULL; // privremeni objekt više nije vlasnik pokazivača

   cout << "Kopiranje prijenosom\n";

}

Ne bi li se isto postiglo i pomoću nečeg ovakvog:

Test& destructive_copy_from(Test& other)

{

  p = other.p;

  other.p = NULL;

}

Test ttt;

ttt.destructive_copy_from(Test(10));

 

... tj. griješim li ako mi se čini da je samo zakompliciran jezik dodavanjem novog operatora?

 

14 godina
neaktivan
offline
Re: Što služi ova funkcija?

To bi bilo u redu ako bi se s desne strane operatora = uvijek nalazio samo privremeni objekt. No ako postoji ovako nešto:

 

Test A, B(10);

A = B;

 

B nije privremeni objekt i zato A ne smije od njega ukrasti pokazivač već baš mora napraviti njegovo duboko kopiranje. Kada bi A ukrao pokazivač od B onda bi A i B dijelili istu memorijsku lokaciju, a to je greška.

 

Ali ako imaš privremeni objekt onda se to smije napraviti jer privremenom objektu taj pokazivač ne treba:

 

Test A;

A = Test(10);

 

Umjesto da A radi vlastitu alokaciju memorije ona ukrade već alociranu memoriju privremenog objekta jer ona njemu više ne treba pošto privremeni objekt ionako umire u sljedećoj naredbi.

 

Zato je najbolje u programu imati obje implementacije ovog operatora tj. s jednom referencom (duboko kopiranje) i rvalue referencom (kopiranje prijenosom), a program automatski zna koju od njih će pozvati tj. sam će vidjeti da li se vrši pridruživanje privremenog objekta ili nekog već postojećeg (stalnog).

Poruka je uređivana zadnji put uto 26.8.2014 23:46 (TracerCPP).
10 godina
neaktivan
offline
Što služi ova funkcija?

Opet ja {#}

 

Zadatak glasi: napišite rekurzivnu lambda funkciju koja računa sumu svih cijelih brojeva od A do B (A < B). 

 

Neznam kako da ovo napišem jer su lambda anonimne funkcije.

 

Još samo ovo, pliz! Sutra imam razgovor!

 
1 1 hvala 0
14 godina
neaktivan
offline
Re: Što služi ova funkcija?

Sorry, ali ovdje na forumu ne rješavamo nikome gotove zadatke bez da autor prethodno ne pokaže nekakav trud. Znam da je hitno - uvijek jest, ali zato evo bar male pomoći.

 

Lambda funkcije jesu u pravilu anonimne ali ih možeš "imenovati" izrazom function. U tvom slučaju to je nužno za napraviti jer rezultat jednog rekurzivnog poziva se nekako mora vratiti prethodnom pozivu itd.

 

function<int(int, int)> suma = [&suma](int a, int b)->int{
    // ...
}

 

Kako točno glasi tijelo funkcije je na tebi da napišeš.

Poruka je uređivana zadnji put čet 28.8.2014 17:55 (TracerCPP).
17 godina
offline
Što služi ova funkcija?

Dakle, preko delegata.

 

 

#include<iostream>
#include<functional>
using namespace std;

int main() {
    function<int(int, int)> suma = [&suma](int a, int b) -> int
    {
       if (a > b) return 0;
       return a + suma(a + 1, b);
    };
    cout<< suma(1, 5);
    return 0;
}

 

Ajde, nek joj bude ovaj put, sorry profesore {#}

Rekurzija kao rekurzija, složiš na stog brojeve i kad ih kupiš onda zbrajaš.

Poruka je uređivana zadnji put čet 28.8.2014 20:32 (Floki).
 
2 0 hvala 0
14 godina
neaktivan
offline
Re: Što služi ova funkcija?

Ajd ovaj put ćemo tolerirati pa da i drugi vide kako se koriste lambde i delegati u C++u {#}

17 godina
neaktivan
offline
Re: Što služi ova funkcija?
Ivana G kaže...

Opet ja {#}

 

Zadatak glasi: napišite rekurzivnu lambda funkciju koja računa sumu svih cijelih brojeva od A do B (A < B). 

 

Neznam kako da ovo napišem jer su lambda anonimne funkcije.

 

Još samo ovo, pliz! Sutra imam razgovor!

Kasno palim ali bas me zanima koja to cool firma u Hr ima takva pitanja?

5 minuta? ENT? Mireo?

 

 

Poruka je uređivana zadnji put uto 7.10.2014 3:07 (Zoidberg).
14 godina
neaktivan
offline
Re: Što služi ova funkcija?

I ja sam ju to odmah gore pitao jer mi djeluje na namješten natječaj..

Poruka je uređivana zadnji put uto 7.10.2014 8:45 (TracerCPP).
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice