如何使用向量(类)使find()函数

时间:2018-12-07 12:18:06

标签: c++ algorithm vector find std

有像这样的班

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 / algorithm:在'_InputIterator的实例中   std :: __ 1 :: find(_InputIterator,_InputIterator,const _Tp&)[   _InputIterator = std :: __ 1 :: __ wrap_iter; _Tp = C_Service]':

     

与'operator =='不匹配(操作数类型为'C_Service *'和'const   C_Service')

我搜索到,当我在Container中使用find()函数时,它可以使用operator== 但是,我没有目标。.T.T

我怎么了?

1 个答案:

答案 0 :(得分:0)

问题在于您的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; })