更好的std::在指针集合上查找,并将取消引用的值与常量引用值进行比较
Better std::find on a collection of pointers and comparing dereferenced value to a const reference value
最初我有一个成员是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
中的一个。
相关文章:
- C++取消引用指针.为什么会发生变化
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 取消引用运算符不能重载
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- C++ 关于指针取消引用的技术问题
- 没有取消引用/解包对象的标准方法?
- 列表 iter 不取消引用 使用列表进行插入排序
- 在这个函数中是有缺陷的,因为取消引用 null 是无效的,所以我想更改代码
- 取消引用结束指针到数组类型的一个
- 取消引用向量时出现问题
- 取消引用指向整数的指针时获得不同的结果
- C++:取消引用十六进制值,有点语法问题
- C/C++ 取消引用错误:在空检查之前取消引用
- 取消引用后C++空测试
- 立即取消引用unique_ptr
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 取消引用 void 指针以将值分配给结构
- boost_multi_index迭代器取消引用给出常量
- 为什么"std::uninitialized_copy"通常取消对未初始化内存的迭代器的引用不是未定
- 矢量迭代器不能与 std::shared_ptr<> 取消引用