• 25 odgovora
  • 9.537 pregleda
Re: stl vector 05.12.2003. u 14:15 · pre 278 meseci #21
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.
Re: stl vector 05.12.2003. u 16:33 · pre 278 meseci #22
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?
Re: stl vector 05.12.2003. u 18:45 · pre 278 meseci #23
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;
}

Re: stl vector 05.12.2003. u 22:47 · pre 278 meseci #24
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));
Re: stl vector 05.12.2003. u 23:17 · pre 278 meseci #25
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.
Re: stl vector 05.12.2003. u 23:21 · pre 278 meseci #26
Upravo mi je iskompajlirao verziju sa mem_fun_ref umesto mem_fun !
Jos da vidimo da li radi!
Odgovori
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme