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

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

27.02.2013, 11:55. Просмотров 604. Ответов 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'
http://www.cyberforum.ru/cpp-beginners/thread1392790.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.02.2013, 11:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Не могу написать функтор для поиска в векторе (C++):

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

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

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

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

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

4
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 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 / 1
Регистрация: 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
644 / 565 / 164
Регистрация: 13.12.2012
Сообщений: 2,112
Завершенные тесты: 1
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
_
314 / 148 / 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
Привет! Вот еще темы с решениями:

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

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

Написать функцию для поиска максимального элемента в указанной строке матрицы
Всем добрый вечер! Есть задание к лабораторной работе Написать функцию, для...

Написать программу для поиска всех элементов в массиве за заданным ключом
#include &lt;iostream&gt; #include &lt;ctime&gt; using namespace std; int i, N;...


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

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

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