С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
NikosQuattro
0 / 0 / 0
Регистрация: 27.02.2013
Сообщений: 4
1

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

27.02.2013, 11:55. Просмотров 622. Ответов 4
Метки нет (Все метки)

Есть вектор, содержащий указатели на класс, нужно использовать функцию 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'
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2013, 11:55
Ответы с готовыми решениями:

Не могу грамотно написать цикл поиска (зацикливается)
#include &lt;iostream&gt; #include &lt;conio.h&gt; #include &lt;math.h&gt; #include &lt;fstream&gt;...

Добавить методы поиска медианного элемента в матрице и векторе
Здравствуйте есть программа #include &quot;stdafx.h&quot; #include &lt;stdlib.h&gt; #include...

Написать регулярное выражение для поиска строки
Доброго времени суток. Изучаю регулярные выражения. Столкнулся с проблемой....

Написать программу для поиска определителя до 10 порядка включительно
Здравствуйте. Очень нужна помощь. Нужно написать программу для поиска...

Написать шаблон функции для поиска среднего арифметического массива
Написать шаблон функции для поиска среднего арифметического значений массива

4
Tulosba
:)
Эксперт С++
4750 / 3244 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
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;
};
1
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
0
aLarman
646 / 567 / 164
Регистрация: 13.12.2012
Сообщений: 2,123
Завершенные тесты: 2
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/
что ты вообще хотел написать ?
0
ya_noob
_
315 / 149 / 27
Регистрация: 08.10.2011
Сообщений: 432
27.02.2013, 13:52 5
Цитата Сообщение от NikosQuattro Посмотреть сообщение
Как я понял мне нужно написать функтор, в котором нужно переопределить операцию сравнения классов
Неверно поняли. где вы увидели, что find принимает в качестве аргумента функтор? В вашей ситуации нужно переопределить operator== для ... эммм, для класса указателей на B, т.е. вам нужен класс-обертка для B * (BPointer) и в нем переопределить нужную операцию, а также вместо
vector<B*> vecta использовать vector<BPointer> vecta и может чего еще.
0
27.02.2013, 13:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.02.2013, 13:52

Написать регулярное выражение для поиска слов заканчивающихся на –ing
Необходимо написать регулярное выражение для поиска слов заканчивающихся на...

Написать шаблон функции для поиска среднего арифметического значений массива
#include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; template...

Написать шаблон функции для поиска среднего арифметического значений массива
Кто знает как решить задачу на С++, при помощи шаблонов функций? Написать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru