更好的std::在指针集合上查找,并将取消引用的值与常量引用值进行比较

Better std::find on a collection of pointers and comparing dereferenced value to a const reference value

本文关键字:引用 取消 比较 常量 指针 std 集合 更好 查找      更新时间:2023-10-16

最初我有一个成员是std::vector<Point>,其方法是:

bool Spline::Intersects(const Point& point) const {
    return std::find(this->_result_points.begin(), _result_points.end(), point) != _result_points.end();
}

设计发生了变化,std::vector<Point>变成了std::vector<Point*>,以前的方法不再有效,我不得不将其更改为:

bool Spline::Intersects(const Point& point) const {
    for(std::vector<Point*>::const_iterator _iter = _result_points.begin(); _iter != _result_points.end(); ++_iter) {
        if(*(*_iter) == point) return true;
    }
    return false;
}

std::find是否执行相同的线性搜索?如果是这样的话,有没有一种更快/更好/不那么粗糙的方法来做到这一点(尤其是迭代器的双重去引用)?

代码中还有其他地方执行std::find(this->_result_points.begin(), _result_points.end(), point) != _result_points.end();(或类似但相反的结果),我宁愿不必使用慢速线性for循环。

是的,find执行相同的线性搜索。

您可以通过使用find_if和合适的谓词来隐藏循环和双重间接寻址:bool operator()(Point* ptr) { return *ptr == point; }

如果希望避免线性搜索,则需要更改数据的存储方式。例如,保持矢量排序将允许std::binary_search,它比std::find快。它是按指向的值排序的,而不是按指针值排序,所以您需要向std::sort等传递一个比较器。或者您可以使用一个完全不同的容器:也许是(unordered_)(multi)set中的一个。