C++ std::vector 搜索值

2024-05-23

我正在尝试优化std::vector“搜索” - 基于索引的迭代向量并返回与“搜索”条件匹配的元素

struct myObj {
   int id;
   char* value;
};

std::vector<myObj> myObjList;

创建数千个具有独特性的条目id和值并将它们推入向量myObjList.

最有效的找回方式是什么myObj匹配的id。 目前我正在索引迭代,例如:

for(int i = 0; i < myObjList.size(); i++){
   if(myObjList.at(i).id == searchCriteria){
    return myObjList.at(i);
   }
}

Note: searchCriteria = int。所有元素都有其独特之处id的。 上面的方法可以完成工作,但可能不是最有效的方法。


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;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ std::vector 搜索值 的相关文章