我有一个存储类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 *)函数。
答案 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(...);
}