Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

stl vector

[es] :: C/C++ programiranje :: stl vector

Strane: 1 2

[ Pregleda: 6884 | Odgovora: 25 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: stl vector05.12.2003. u 14:15 - pre 248 meseci
Ponekad moze.
Poenta je u tome da remove_if trazi predikat (http://www.sgi.com/tech/stl/Predicate.html) kome nekako mora da prosledi (referencu na) objekat za koji se proverava da li ga treba brisati ili ne i kao odgovor ocekuje bool vrednost.
Nacin na koji se zove predikat je:
Code:

if (predikat(objekat)) ...

pa operator() sluzi da bi predikat tako mogao da bude pozivan.

U odredjenim situacijama i klasicne C funkcije, staticki i ne-staticki metodi klasa mogu biti pozivani kao predikati, ali to zahteva da se funkcijama iz functional hedera, ili slicnim (npr. iz boost biblioteke) prilagode da postanu predikti. Pogledaj bind(1st, 2nd), mem_fn (odnosno mem_fun) i slicne funkcije.
 
Odgovor na temu

darkosos
Darko Šoš
Beograd

Član broj: 5053
Poruke: 1131
*.ptt.yu



+64 Profil

icon Re: stl vector05.12.2003. u 16:33 - pre 248 meseci
upravo pokusavajuci
Citat:

Pogledaj bind(1st, 2nd), mem_fn (odnosno mem_fun) i slicne funkcije.

sam i dobio onu gresku; dakle mogu samo da nabadam kako to treba da se uradi, ali ako neko zna odmak da kaze kako, ustedeo bik se nabadanja :)

Dakle, kako od bool funkcije, clanice neke strukture/klase da dobijem "predikat" koji mogu da prosledim u remove_if? Kako se koristi mem_fun?
 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: stl vector05.12.2003. u 18:45 - pre 248 meseci
Evo jednog primera sa boost::bind i boost::mem_fn, na VC++ 6.0
Code:

#include <iostream>
#include <algorithm>
#include <vector>
#include <boost/bind.hpp>
#include <boost/mem_fn.hpp>

class klasa {
public:
    klasa(int val) : Val_(val) {}

    bool manje_od(int max) const { return Val_ < max; }

    int value() const { return Val_; }

private:
    int Val_;
};

void
napravi(std::vector<klasa> &v, int broj)
{
    for (int i = 0; i < broj; ++i) {
        v.push_back(i);
    }
}

void
ispisi(const std::vector<klasa> &v)
{
    for (std::vector<klasa>::const_iterator i = v.begin(); i != v.end(); ++i) {
        std::cout << i->value() << " ";
    }
    std::cout << std::endl;
}

int
main(int argc, char* argv[])
{
    std::vector<klasa> v;
    napravi(v, 10);

    // Obrisi elemente manje od 3
    std::vector<klasa>::iterator kraj = std::remove_if(v.begin(), v.end(),
                       boost::bind<bool>(boost::mem_fn(&klasa::manje_od), _1, 3));
    v.erase(kraj, v.end());

    ispisi(v);

    return 0;
}

 
Odgovor na temu

darkosos
Darko Šoš
Beograd

Član broj: 5053
Poruke: 1131
*.ptt.yu



+64 Profil

icon Re: stl vector05.12.2003. u 22:47 - pre 248 meseci
Veoma mi je žao, ali tako nešto kao boost nemam ni izdaleka!
U svakom slučaju hvala puno na trudu :)
Moraću to nekako drukčije da rešim...
Osim ako... da, mogao bi da mi mail-uješ (ili slično) te .h i .cpp fajlove!
Ili ako može nešto bez boost-a.

Evo, na primer, šta kompajler ne prihvata (prijavljuje grešku u algorithm fajlu) :
Code:

struct A {...; bool F();};
vector<A> v;
vector<A>::iterator last = remove_if(v.begin(), v.end(), mem_fun(&A::F));
 
Odgovor na temu

sspasic
Sasa Spasic

Član broj: 3261
Poruke: 175
*.medianis.net

Jabber: sspasic@elitesecurity.org
ICQ: 35454521


Profil

icon Re: stl vector05.12.2003. u 23:17 - pre 248 meseci
Boost mozes naci na www.boost.org.

Inace, evo listinga dopunjenog sa par primera koji ne koriste boost:

Code:

#include <iostream>
#include <algorithm>
#include <vector>
#include <functional>
#include <boost/bind.hpp>
#include <boost/mem_fn.hpp>

class klasa {
public:
    klasa(int val) : Val_(val) {}

    bool manje_od(int max) const { return Val_ < max; }

    int value() const { return Val_; }

    bool za_brisanje() { return Val_ < 4; }
    bool operator<(const klasa &o) const { return Val_ < o.Val_; }

private:
    int Val_;
};

void
napravi(std::vector<klasa> &v, int broj)
{
    for (int i = 0; i < broj; ++i) {
      v.push_back(i);
    }
}

void
ispisi(const std::vector<klasa> &v)
{
    for (std::vector<klasa>::const_iterator i = v.begin(); i != v.end(); ++i) {
      std::cout << i->value() << " ";
    }
    std::cout << std::endl;
}

class kriterijum {
public:
    kriterijum(int val) : Val_(val) {}

    bool operator()(const klasa &o) { return o.value() < Val_; }

private:
    int Val_;
};

int
main(int argc, char* argv[])
{
    std::vector<klasa> v;
    napravi(v, 10);

    // Obrisi elemente manje od 3
    std::vector<klasa>::iterator kraj = std::remove_if(v.begin(), v.end(),
      boost::bind<bool>(boost::mem_fn(&klasa::manje_od), _1, 3));
    v.erase(kraj, v.end());
    ispisi(v);

    kraj = std::remove_if(v.begin(), v.end(),
      std::mem_fun_ref(&klasa::za_brisanje));
    v.erase(kraj, v.end());
    ispisi(v);

    kraj = std::remove_if(v.begin(), v.end(), kriterijum(5));
    v.erase(kraj, v.end());
    ispisi(v);

    kraj = std::remove_if(v.begin(), v.end(),
         std::bind2nd(std::less<klasa>(), klasa(6)));
    v.erase(kraj, v.end());
    ispisi(v);

    return 0;
}

Iskreno, pomocu funkcija standardne biblioteke ne umem da napisem primer ekvivalentan onom koji koristi boost sa VC++ 6.0.
 
Odgovor na temu

darkosos
Darko Šoš
Beograd

Član broj: 5053
Poruke: 1131
*.ptt.yu



+64 Profil

icon Re: stl vector05.12.2003. u 23:21 - pre 248 meseci
Upravo mi je iskompajlirao verziju sa mem_fun_ref umesto mem_fun !
Jos da vidimo da li radi!
 
Odgovor na temu

[es] :: C/C++ programiranje :: stl vector

Strane: 1 2

[ Pregleda: 6884 | Odgovora: 25 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.