как сделать функцию find () используя вектор (класс) - PullRequest
0 голосов
/ 07 декабря 2018

есть класс, такой как

class C_Service
{
public :

    C_Service(); {memset(this, 0, sizeof(*this));}
    C_Service(int type, int idx) {memset(this, 0, sizeof(*this));   this->type = type;  this->idx = idx;}
    bool operator==(const C_Service& svc) const { return (this->type == svc.type && this->idx == svc.idx);}

    word    type;
    word    idx;

    dword   aId;
    dword   bId;
    char*   name; 
};

Я использовал тестовый код, как показано ниже,

void vec_find(int type, int idx)
{
    vector<C_Service*> vec;

    // added several items in vector vec
    ...

    vector<C_Service*>::iterator iter;
    C_Service cSvc(type, idx);
    iter = find(vec.begin(), vec.end(), &cSvc);
    C_Service* findsvc = *iter;
    if(findsvc)
        printf("FOUND : type(%d), idx(%d), name(%s)\n", findsvc->type, findsvc->idx, findsvc->name);
    else
        printf("Not FOUND!!\n");
}

тогда он выдает "НЕ НАЙДЕНО !!"даже установить правильное значение.Я нашел что-то не так и пытаюсь изменить ..

iter = find(vec.begin(), vec.end(), &cSvc);

на

iter = find(vec.begin(), vec.end(), cSvc);

удалить "&", а затем выдается сообщение об ошибке компиляции

/ libcxx /Алгоритм: в экземпляре '_InputIterator std :: __ 1 :: find (_InputIterator, _InputIterator, const _Tp &) [with _InputIterator = std :: __ 1 :: __ wrap_iter;_Tp = C_Service] ':

нет совпадения для' operator == '(типы операндов:' C_Service * 'и' const C_Service ')

Я искал это, когда использую find() функция в контейнере, он может использовать operator==, но я не могу получить цель .. TT

В чем моя вина?

1 Ответ

0 голосов
/ 07 декабря 2018

Проблема в том, что ваш vec является вектором указателей, а не вектором C_Service объектов.

Таким образом

find(vec.begin(), vec.end(), &cSvc)

проверяет, является ли адрес cSvc переменная содержится в vec (это не потому, что вы только что создали cSvc, поэтому на нее нельзя ссылаться откуда-либо еще).Он вообще не использует ваш operator==, он просто сравнивает указатели.

Чтобы исправить это, вы можете либо изменить vec на std::vector<C_Service> и сделать

find(vec.begin(), vec.end(), cSvc)

или передайте пользовательский предикат в find_if, где вы можете разыменовать ваши указатели вручную:

find_if(vec.begin(), vec.end(), [&](const C_Service *p) { return *p == cSvc; })
...