поиск в векторе не могу опредилить функтор
От: Аноним  
Дата: 04.04.08 08:14
Оценка:
Здравствуйте вот вопрос:

class ctest
{
public:
    int m_a;
    long m_b;
    ctest(int a,long b):m_a(a),    m_b(b)
    {}
    
};
class MyFunck
{
    int m_t;
public:
    MyFunck(int t):m_t(t)
    {
    }
    bool operator == (ctest *obj) {return m_t==obj->m_a;}

};
typedef std::vector<ctest> vTest;
int _tmain(int argc, _TCHAR* argv[])
{
    vTest m_vTest;
    m_vTest.push_back(ctest(2,5));
    m_vTest.push_back(ctest(3,6));
    std::find(m_vTest.begin(),m_vTest.end(),MyFunck(2));
}


Компилятор выдает кучю ошибок, а как мне правильно определить функтор для поиска в векторе значения ctest::m_a
Re: поиск в векторе не могу опредилить функтор
От: Bell Россия  
Дата: 04.04.08 08:25
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Компилятор выдает кучю ошибок, а как мне правильно определить функтор для поиска в векторе значения ctest::m_a


У тебя в векторе лежат не указатели — зачем же ты пишешь в operator == указатель? Кроме того, в данном случае operator == не может быть членом функтора — в алгоритме find сравнивается элемент контейнера (слева) и переданное значение (справа), так что объект-функтор должен стоять на втором месте в списке аргументов operator ==. Есле же operator == является членом класса, то функтор (то бишь ссылка на себя) стоит на первом месте.

И вообще, ИМХО, при использовании функторов нагляднее использовать find_if.

В общем вот примеры:


class ctest
{
public:
    int m_a;
    long m_b;
    ctest(int a,long b):m_a(a),    m_b(b)
    {}
    
};
class MyFunck
{
    int m_t;
public:
    MyFunck(int t):m_t(t)
    {
    }
    bool operator () (const ctest& obj) const {return m_t==obj.m_a;}

};

class MyFunck2
{
    int m_t;
public:
    MyFunck2(int t):m_t(t)
    {
    }
    friend bool operator == (const ctest& obj, const MyFunck2& mf2) {return mf2.m_t==obj.m_a;}
};



typedef std::vector<ctest> vTest;
int main()
{
    vTest m_vTest;
    m_vTest.push_back(ctest(2,5));
    m_vTest.push_back(ctest(3,6));
    std::find(m_vTest.begin(),m_vTest.end(),MyFunck2(2));
    std::find_if(m_vTest.begin(),m_vTest.end(),MyFunck(2));

   return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re: поиск в векторе не могу опредилить функтор
От: alzt  
Дата: 04.04.08 08:26
Оценка:
Здравствуйте, Аноним, Вы писали:

find_if
Re: поиск в векторе не могу опредилить функтор
От: perf13  
Дата: 04.04.08 08:27
Оценка:
А>class MyFunck
А>{
А> int m_t;
А>public:
А> MyFunck(int t):m_t(t)
А> {
А> }
А> bool operator == (ctest *obj) {return m_t==obj->m_a;}

А>как мне правильно определить функтор для поиска в векторе значения ctest::m_a


в MyFunck нужно определять не оператор сравнения, а оператор вызова функции
bool operator()(ctest *obj) {return m_t==obj->m_a;}
Re: поиск в векторе не могу опредилить функтор
От: valery_l Россия  
Дата: 04.04.08 08:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте вот вопрос:


А>class ctest
А>{
А>public:
А>    int m_a;
А>    long m_b;
А>    ctest(int a,long b):m_a(a),    m_b(b)
А>    {}
    
А>};
А>class MyFunck
А>{
А>    int m_t;
А>public:
А>    MyFunck(int t):m_t(t)
А>    {
А>    }
А>    bool operator == (ctest *obj) {return m_t==obj->m_a;}


bool operator()( ctest const& obj ) const { return m_t==obj.m_a ; }

А>};

А>typedef std::vector<ctest> vTest;
А>int _tmain(int argc, _TCHAR* argv[])
А>{
А>    vTest m_vTest;
А>    m_vTest.push_back(ctest(2,5));
А>    m_vTest.push_back(ctest(3,6));
А>    std::find(m_vTest.begin(),m_vTest.end(),MyFunck(2));


std::find_if(m_vTest.begin(),m_vTest.end(),MyFunck(2)) ;

А>}


А>Компилятор выдает кучю ошибок, а как мне правильно определить функтор для поиска в векторе значения ctest::m_a
Re: поиск в векторе не могу опредилить функтор
От: Кодт Россия  
Дата: 04.04.08 09:24
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Компилятор выдает кучю ошибок, а как мне правильно определить функтор для поиска в векторе значения ctest::m_a


Внесём ясность.

Функтор (в С++ном понимании) — это класс, у которого определён operator().
Поиск с функтором — это поиск по условию, find_if(begin,end,predicate), где predicate — унарная функция, принимающая элемент последовательности и возвращающая bool-совместимое значение.
vector<ctest>::iterator = std::find_if(vec.begin(), vec.end(), boost::bind(&ctest::m_a, _1) == 123);

// или, если хочется велосипедов

class test_a
    : std::unary_function<ctest const&, bool> // это необязательно, но может пригодиться
{
    int m_a;
public:
    explicit test_a(int a) : m_a(a) {}
    bool operator() (ctest const& t) const { return t.m_a == m_a; }
};

.....

vector<ctest>::iterator found = std::find_if(vec.begin(), vec.end(), test_a(123));



Ты же выполняешь поиск по тождеству. find(begin,end,value), где value — значение, для которого определена операция == с элементами последовательности.

В принципе, можно сделать такое
class value_a
{
    int m_a;
public:
    explicit value_a(int a) : m_a(a) {}
    friend bool operator==(ctest const& t, value_a v) { return t.m_a == v.m_a; }
};

.....

vector<ctest>::iterator found = std::find(vec.begin(), vec.end(), value_a(123));

Обрати внимание на то, что левый аргумент — это элемент, а правый — искомое значение. Такова особенность алгоритма find().
А у оператора-члена левый аргумент — класс, членом которого он является.

Да, и не забудь про константности.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.