通过比较字符串与对象的变量来查找存储在std :: vector中的对象

时间:2017-03-28 16:54:04

标签: c++

我有一个存储类IdKaart对象的向量。

std::vector<IdCard *> IdCard_vect;

在课程定义下面:

#ifndef IDCARD_H
#define IDCARD_H
#include <string>
#include <vector>
#include <iostream>

using namespace std;


class Lock;


class IdCard {

public:
    IdCard(string, string, string);
    string userId();
    void giveAccess(Lock*);
    void removeAccess(Lock*);
    bool hasAccess(Lock*);

private:
    string id;
    vector<Lock*> access;
    string name, adress;
};

#endif // IDCARD_H

我需要能够通过比较字符串和&#34; id&#34;来在上面的向量中找到一个对象。考虑到这个id是私有的,成员函数&#34; userId()&#34;用于返回此字符串。

当找到上面的对象时,我需要能够调用giveAccess(Lock *)函数。

2 个答案:

答案 0 :(得分:2)

您可以使用std::find_if

std::string idToFind = …;
auto it = std::find_if(IdCard_vect.begin(), IdCard_vect.end(),
                       [&](IdCard* card) { return card->userId() == idToFind; });
if (it != IdCard_vect.end()) {
    // card was found, can be accessed with `*it`.
}

或者是一个好老的for-if:

IdCard* result = nullptr;
for (IdCard* card : IdCard_vect)
    if (card->userId() == idToFind)
        result = card;

答案 1 :(得分:1)

如果你不能/不想使用lambdas,你可以创建一个自定义谓词仿函数:

struct pointerIdCompare : public std::unary_function<IdCard*, bool>
{
  pointerIdCompare(const std::string &id) : _id(id) {}

  bool operator() (const IdCard* idCard)
  { return idCard->userId() == _id; }

  std::string _id;
};

然后在find_if中使用它来获取迭代器:

std::vector<IdCard*>::const_iterator cIt = std::find_if(IdCard_vect.begin(), IdCard_vect.end(), pointerIdCompare("some-id"));

然后使用此迭代器调用giveAccess

if ( cIt != IdCard_vect.end() )
{
    (*cIt)->giveAccess(...);
}