Форум программистов, компьютерный форум CyberForum.ru

Не могу написать функтор для поиска в векторе - C++

Восстановить пароль Регистрация
 
NikosQuattro
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 4
27.02.2013, 11:55     Не могу написать функтор для поиска в векторе #1
Есть вектор, содержащий указатели на класс, нужно использовать функцию find, которая ищет элемент по полю в классе. Как я понял мне нужно написать функтор, в котором нужно переопределить операцию сравнения классов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
class A:public C
{
public:
    A(int f1, int f2):C(f2)
    {fielda=f1;}
//=========================================
    int geta()
    {
        return fielda;
    }
    void add(int a,int b)
    {
        tmp=new B(a,b);
        vecta.push_back(tmp);
        vectc.push_back(tmp);
    }
    int count()
    {
        return vecta.size();
    }
    B b(int c)
    {
        return *(vecta[c]);
    }
    vector<B*>::iterator it;
    vector<B*> vecta;
private:
    int fielda;
    B *tmp;
};
void out(A* c1)
{
    for (int i=0;i<(*c1).count();i++)
        {
            cout<<c1->b(i).getb();
            cout<<c1->b(i).getd();
            cout<<"\n";
        }
}
class CCompTitle
{
public:
bool operator()(B* n1,int t)
{
return (n1->fieldb==t);
}
};
int main()
{
    A* c1;
    int tmp1,tmp2,i,n;
        cin>>tmp1>>tmp2;
        c1=new A(tmp1,tmp2);
        cin>>n;
        for(i=0;i<n;i++)
        {
            cin>>tmp1>>tmp2;
            c1->add(tmp1,tmp2);
        }
        out(c1);;
 
        cin>>tmp1;
        c1->it=find(c1->vecta.begin(),c1->vecta.end(),CCompTitle(tmp1));
А компилятор пишет error C2440: '<function-style-cast>' : cannot convert from 'int' to 'CCompTitle'
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2013, 11:55     Не могу написать функтор для поиска в векторе
Посмотрите здесь:

Написать шаблон функции для поиска среднего арифметического массива C++
Поиска в записанном ранее файле по фамилии или по группе с выбором параметра поиска C++
Написать шаблон функции для поиска среднего арифметического значений массива C++
C++ Функтор
Добавить методы поиска медианного элемента в матрице и векторе C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт C++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
27.02.2013, 12:19     Не могу написать функтор для поиска в векторе #2
Попробуйте так:
C++
1
2
3
4
5
6
7
8
9
10
11
class CCompTitle
{
public:
   CCompTitle( int t ): t(t) {}
   bool operator()(B* n1)
   {
      return (n1->fieldb==t);
   }
private:
   int t;
};
NikosQuattro
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 4
27.02.2013, 12:52  [ТС]     Не могу написать функтор для поиска в векторе #3
Нет, пишет: Error 1 error C2679: binary '==' : no operator found which takes a right-hand operand of type 'const CCompTitle' (or there is no acceptable conversion) d:\program files\vs\vc\include\xutility 3186 1 TLP1
aLarman
636 / 557 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
27.02.2013, 13:05     Не могу написать функтор для поиска в векторе #4
Цитата Сообщение от NikosQuattro Посмотреть сообщение
C++
1
2
3
4
void add(int a,int b) { 
tmp=new B(a,b); 
vecta.push_back(tmp); 
vectc.push_back(tmp); }
по указателю сздал объект, добавил копию этого адреса в вектор, вышел из функции, по этому адресу объект удалился, и на что теперь указывает указатель в векторе?(читаем С.Майерса эффективное использование stl)

Цитата Сообщение от NikosQuattro Посмотреть сообщение
C++
1
c1->it=find(c1->vecta.begin(),c1->vecta.end(),CCompTitle(tmp1));
если это find из <algorithm> то ты его сигнатуру видел? он вообще принимает const T&, читает тут http://www.cplusplus.com/reference/algorithm/find/
что ты вообще хотел написать ?
ya_noob
_
200 / 144 / 9
Регистрация: 08.10.2011
Сообщений: 432
27.02.2013, 13:52     Не могу написать функтор для поиска в векторе #5
Цитата Сообщение от NikosQuattro Посмотреть сообщение
Как я понял мне нужно написать функтор, в котором нужно переопределить операцию сравнения классов
Неверно поняли. где вы увидели, что find принимает в качестве аргумента функтор? В вашей ситуации нужно переопределить operator== для ... эммм, для класса указателей на B, т.е. вам нужен класс-обертка для B * (BPointer) и в нем переопределить нужную операцию, а также вместо
vector<B*> vecta использовать vector<BPointer> vecta и может чего еще.
Yandex
Объявления
27.02.2013, 13:52     Не могу написать функтор для поиска в векторе
Ответ Создать тему
Опции темы

Текущее время: 09:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru