STL find_if
От: Аноним  
Дата: 02.07.04 11:34
Оценка:
Хочется воспользоватся сабж в следующем случае:


class Base {
...
bool operator < (Base &b){...}
...
}

class Deriver : public Base {...}

typedef std::vector<Deriver*> Vec;

bool find(Base &b, Vec &vec){
 return ??? // как найти с помощью STL
}
Re: STL find_if
От: Glоbus Украина  
Дата: 02.07.04 11:53
Оценка:
Здравствуйте, Аноним, Вы писали:

Может так?

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

class CA
{
public:
    int i;
    CA(int _val)
    {
        this->i = _val;
    }
    bool operator < ( const CA& _val ) const
    {
        return i < _val.i;
    }
};

class CB : public CA
{
public:
    CB(int _val) : CA(_val)
    {
    }
};

class Condition
{
public:
    Condition( CA* _cmp )
    {
        this->m_Cmp = _cmp;
    }

    bool operator() ( CA* _val )
    {
        return *_val < *m_Cmp;
    }
    CA* m_Cmp;

    
};

bool find(CA &b, std::vector<CB*> &vec){
    std::vector<CB*>::iterator find_it;
    find_it = std::find_if( vec.begin(), vec.end(), Condition(&b) );
    return find_it != vec.end();
}



int main()
{
    std::vector<CB*> v;
    for(int i=0;i < 10; ++i )
    {
        CB* val = new CB(i);
        v.push_back( val );
    }
    CB comp(-11);
    
    std::cout << find( comp, v ) << std::endl;
}
Удачи тебе, браток!
Re[2]: STL find_if
От: Аноним  
Дата: 02.07.04 12:05
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Здравствуйте, Аноним, Вы писали:


G>Может так?


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

G>class CA

G>class Condition
G>{
G>public:
G>    Condition( CA* _cmp )
G>    {
        this->>m_Cmp = _cmp;
G>    }

G>    bool operator() ( CA* _val )
G>    {
G>        return *_val < *m_Cmp;
G>    }
G>    CA* m_Cmp;

    
G>};
G>}


можно конечно и так
токо вот хочется без вспомогательного класса (Condition)
Re[3]: STL find_if
От: Glоbus Украина  
Дата: 02.07.04 12:09
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Glоbus, Вы писали:


G>>Здравствуйте, Аноним, Вы писали:


G>>Может так?


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

G>>class CA

G>>class Condition
G>>{
G>>public:
G>>    Condition( CA* _cmp )
G>>    {
        this->>>m_Cmp = _cmp;
G>>    }

G>>    bool operator() ( CA* _val )
G>>    {
G>>        return *_val < *m_Cmp;
G>>    }
G>>    CA* m_Cmp;

    
G>>};
G>>}


А>можно конечно и так

А>токо вот хочется без вспомогательного класса (Condition)

Можно конечно и функцию в виде предиката вмондить, но я честно говоря не знаю тогда как передать ей то, с чем сравнивать — первый параметр в твоей функции find — можно конечно в глобальной переменной, но это самый крайний случай. А как бы ты хотел шоб это выглядело?
Удачи тебе, браток!
Re[4]: STL find_if
От: Аноним  
Дата: 02.07.04 12:19
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Можно конечно и функцию в виде предиката вмондить, но я честно говоря не знаю тогда как передать ей то, с чем сравнивать — первый параметр в твоей функции find — можно конечно в глобальной переменной, но это самый крайний случай. А как бы ты хотел шоб это выглядело?


что-то типа
find_if(... bind2nd(equal_to<Deriver>(),Deriver(&b)) );
токо вот как разыменовать ?
Re[5]: STL find_if
От: Glоbus Украина  
Дата: 02.07.04 12:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Glоbus, Вы писали:


G>>Можно конечно и функцию в виде предиката вмондить, но я честно говоря не знаю тогда как передать ей то, с чем сравнивать — первый параметр в твоей функции find — можно конечно в глобальной переменной, но это самый крайний случай. А как бы ты хотел шоб это выглядело?


А>что-то типа

А>find_if(... bind2nd(equal_to<Deriver>(),Deriver(&b)) );
А>токо вот как разыменовать ?

Так в чем проблема
Вот так вот например работает


bool find(CA &b, std::vector<CB*> &vec){
    std::vector<CB*>::iterator find_it;
    find_it = std::find_if( vec.begin(), vec.end(), std::bind2nd( std::less<CA*>(), &b ) );
    return find_it != vec.end();
}
Удачи тебе, браток!
Re: STL find_if
От: ssm Россия  
Дата: 02.07.04 12:23
Оценка:
Здравствуйте, Аноним, Вы писали:


в первый раз затупил

class MyFindPred
{
    Base &b;
public:
    MyFindPred(Base &b) 
        : b(b)
    {
    }
    
    bool operator()(Deriver * pDerivObj)
    {
        return !((b < *pDerivObj) || (*pDerivObj < b));
    }
};

bool find(Base &b, Vec &vec){
    std::find_if(vec.begin(), vec.end(), MyFindPred(b));
    return true;
}
Re[6]: STL find_if
От: Аноним  
Дата: 02.07.04 12:29
Оценка:
Здравствуйте, Glоbus, Вы писали:

G>Так в чем проблема

G>Вот так вот например работает


G>
G>bool find(CA &b, std::vector<CB*> &vec){
G>    std::vector<CB*>::iterator find_it;
G>    find_it = std::find_if( vec.begin(), vec.end(), std::bind2nd( std::less<CA*>(), &b ) );
G>    return find_it != vec.end();
G>}

G>


а сравниваться что будет адереса или по перегруженому оператору < ?
Re[6]: STL find_if
От: Glоbus Украина  
Дата: 02.07.04 12:30
Оценка:
Здравствуйте, Glоbus, Вы писали:

Cтоп
прогнал
не заработает конечно
Удачи тебе, браток!
Re[2]: STL find_if
От: Аноним  
Дата: 02.07.04 12:35
Оценка:
Здравствуйте, ssm, Вы писали:

ssm>Здравствуйте, Аноним, Вы писали:



ssm>в первый раз затупил


ssm>
ssm>class MyFindPred
ssm>{
ssm>    Base &b;
ssm>public:
ssm>    MyFindPred(Base &b) 
ssm>        : b(b)
ssm>    {
ssm>    }
    
ssm>    bool operator()(Deriver * pDerivObj)
ssm>    {
ssm>        return !((b < *pDerivObj) || (*pDerivObj < b));
ssm>    }
ssm>};

ssm>bool find(Base &b, Vec &vec){
ssm>    std::find_if(vec.begin(), vec.end(), MyFindPred(b));
ssm>    return true;
ssm>}
ssm>


а шаблона такого в STL случайно нету ?
ведь довольно часто приходится в векроте ссылку хранить
Re: STL find_if
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 02.07.04 13:28
Оценка:
Такой код у меня отработал:

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

using namespace std;

class Base: public binary_function<Base *, Base *, bool>
{
    int m_i;
public:
    Base(int i): m_i(i) {}
    
    bool operator<(const Base &b) const
    {
        return (m_i < b.m_i);
    }

    bool operator()(Base *b1, Base *b2) const
    {
        return ((*b1) < (*b2));
    }

    void print()
    {
        cout << "Base object: " << m_i << endl;
    }
};

class Deriver : public Base
{
    int m_j;
public:
    Deriver(int i, int j): Base(i), m_j(j) {}
};


int main()
{
    vector<Deriver *> vct;
    vct.push_back(new Deriver(5,2)); vct.push_back(new Deriver(6,4));
    vct.push_back(new Deriver(2,5)); vct.push_back(new Deriver(1,6));

    Base *b = new Base(3);

    vector<Deriver *>::iterator it = find_if(vct.begin(), vct.end(), bind2nd(*b, b));

    if (it != vct.end() )
        (*it)->print();

    return 0;
}
"Что не завершено, не сделано вовсе" Гаусс
Re[2]: STL find_if
От: sadomovalex Россия http://sadomovalex.blogspot.com
Дата: 02.07.04 13:30
Оценка:
Здравствуйте, sadomovalex, Вы писали:

S>Такой код у меня отработал:


Base object: 2
"Что не завершено, не сделано вовсе" Гаусс
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.