C++ 标准库有一些抽象算法,它们赋予 C++ 一种函数式风味,正如我所说的,它让您可以更专注于搜索标准,而不是如何实现搜索本身。这适用于许多其他算法。
您正在寻找的算法是std::find_if
,通过迭代器范围进行简单的线性搜索。
在 C++11 中,您可以使用 lambda 来表达您的标准:
std::find_if(myObjList.begin(), myObjList.end(), [&](const myObj & o) {
return o.id == searchCriteria;
});
当没有可用的 C++11 时,您必须提供一个谓词(函数对象 (=functor) 或函数指针),如果提供的实例是您要查找的实例,则该谓词返回 true。仿函数的优点是可以参数化,在您的情况下,您希望使用您正在寻找的 ID 参数化仿函数。
template<class TargetClass>
class HasId {
int _id;
public:
HasId(int id) : _id(id) {}
bool operator()(const TargetClass & o) const {
return o.id == _id;
}
}
std::find_if(myObjList.begin(), myObjList.end(), HasId<myObj>(searchCriteria));
此方法返回一个迭代器,该迭代器指向找到的第一个与您的条件匹配的元素。如果没有这样的元素,则返回结束迭代器(它指向向量的末尾,而不是最后一个元素)。所以你的函数可能看起来像这样:
vector<myObj>::iterator it = std::find_if(...);
if(it == myObjList.end())
// handle error in any way
else
return *it;