C++标准库有一些抽象算法,它们给了C++一种功能性香料正如我所说,它可以让您更多地关注搜索条件,而不是如何实现搜索本身。这适用于许多其他算法。
您正在寻找的算法是std::find_if http://en.cppreference.com/w/cpp/algorithm/find,通过迭代器范围进行简单的线性搜索。
在 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;