按类中的特定变量搜索

时间:2012-08-25 16:49:34

标签: c++ list iterator find

我有一个指向类的指针列表:

list<AbsClient*> clients;

AbsClient可以是3:TempClient,RegisteredClient,VIPClient。

在AbsClient内部有一个受保护的变量:phone_number。

我需要遍历客户列表,并搜索特定的电话号码。

我试过了:

    list<AbsClient*>::iterator iter;
    for(iter=clients.begin();iter!=clients.end();++iter)
{
    if(iter->phone_number == phone)
    {

    }
}

但它不允许我访问iter-&gt; phone_number:

  

错误:表达式必须具有指向类的指针

这条线有什么问题?

P.S是否可以使用stl :: find函数并以某种方式告诉它通过“phone_number”变量进行搜索?

谢谢

1 个答案:

答案 0 :(得分:1)

您可以将迭代器视为容器的“指向元素的指针”。容器中元素的类型是AbsClient* - 另一个指针。所以,至少在语法上,你处于双指针状态,所以你需要改变你的解释器的解除引用方式:

(*iter)->phone_number == phone

您的帖子说phone_number是受保护的成员,当您不在该类或派生类中时,您无法访问受保护的变量,因此您需要使用访问器方法或更改数据成员的可见性。

不,您不能使用std::find执行此操作(至少不能直接执行此操作),但您可以使用std::find_if

iter = std::find_if(clients.begin(), clients.end(),
    [phone](AbsClient* cl) { return cl->phone_number == phone; });

如果您不使用C ++ 11,那么它会更冗长:

struct MatchPhone {
    explicit MatchPhone(PhoneNumber p) : phone(p) {}
    bool operator()(AbsClient* cl) {
        return cl->phone_number == phone;
    }
    PhoneNumber phone;
};

// ...
iter = std::find_if(clients.begin(), clients.end(), MatchPhone(phone));
// ...