Здравствуйте вот вопрос:
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
Здравствуйте, Аноним, Вы писали:
А>Компилятор выдает кучю ошибок, а как мне правильно определить функтор для поиска в векторе значения 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;
}
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте вот вопрос:
А>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
Здравствуйте, <Аноним>, Вы писали:
А>Компилятор выдает кучю ошибок, а как мне правильно определить функтор для поиска в векторе значения 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>>