C++ 更好的std::在指针集合上查找并将解引用值与常量引用值进行比较
最初我有一个成员是C++ 更好的std::在指针集合上查找并将解引用值与常量引用值进行比较,c++,search,find,std,C++,Search,Find,Std,最初我有一个成员是std::vector,其方法如下: bool Spline::Intersects(const Point& point) const { return std::find(this->_result_points.begin(), _result_points.end(), point) != _result_points.end(); } 设计改变了,std::vector变成了std::vector,以前的方法不再有效,我不得不将其改为: boo
std::vector
,其方法如下:
bool Spline::Intersects(const Point& point) const {
return std::find(this->_result_points.begin(), _result_points.end(), point) != _result_points.end();
}
设计改变了,std::vector
变成了std::vector
,以前的方法不再有效,我不得不将其改为:
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;
}
bool样条线::相交(常数点和点)常数{
对于(std::vector::const_iter _iter=_result_points.begin();_iter!=_result_points.end();++u iter){
如果(*(*_iter)=点)返回true;
}
返回false;
}
std::find
是否执行相同的线性搜索?如果是这样,是否有更快/更好/更少的方法来实现这一点(特别是迭代器的双重反引用)
std::find(this->_result_points.begin(),_result_points.end(),point)在代码中还有其他地方_结果_points.end()代码>(或类似的,但结果相反)被执行,我不希望使用缓慢的线性for循环。是的,find
执行相同的线性搜索
您可以通过使用带有合适谓词的find_if
隐藏循环和双间接寻址:bool操作符()(Point*ptr){return*ptr==Point;}
如果要避免线性搜索,则需要更改数据的存储方式。例如,保持向量排序将允许std::binary_search
,这比std::find
更快。这是按指向的值排序的,而不是按指针值排序的,因此您需要将比较器传递给std::sort
等。或者您可以使用完全不同的容器:可能是(无序的)(多)set
中的一个,是的,find
执行相同的线性搜索
您可以通过使用带有合适谓词的find_if
隐藏循环和双间接寻址:bool操作符()(Point*ptr){return*ptr==Point;}
如果要避免线性搜索,则需要更改数据的存储方式。例如,保持向量排序将允许std::binary_search
,这比std::find
更快。这是按指向的值排序的,而不是按指针值排序的,因此您需要将比较器传递给std::sort
等。或者您可以使用完全不同的容器:可能其中一个(无序的)(多)set
迭代器必须取消引用两次。这就是C++的原理。迭代器的作用类似于指针。您的向量包含点指针,因此迭代器的作用类似于指向指针的指针,因此需要取消引用两次。@Adrian:迭代器是否使用指针实现是由实现定义的。没有“迭代器的双重取消引用”。您将指针存储在一个标准容器中,这很愚蠢。@Lightness:不管实现如何,“迭代器就像指针一样”。迭代器接口的灵感来自指针。在标准容器中存储指针是否愚蠢取决于引用的生存期。有时这并不愚蠢。@Steve and Lightness:指针用于与一个观察者模式接口,该模式注册指向对象的指针(但不拥有它们)。在堆栈上而不是堆上分配点会导致指针悬空。迭代器必须取消引用两次。这就是C++的原理。迭代器的作用类似于指针。您的向量包含点指针,因此迭代器的作用类似于指向指针的指针,因此需要取消引用两次。@Adrian:迭代器是否使用指针实现是由实现定义的。没有“迭代器的双重取消引用”。您将指针存储在一个标准容器中,这很愚蠢。@Lightness:不管实现如何,“迭代器就像指针一样”。迭代器接口的灵感来自指针。在标准容器中存储指针是否愚蠢取决于引用的生存期。有时这并不愚蠢。@Steve and Lightness:指针用于与一个观察者模式接口,该模式注册指向对象的指针(但不拥有它们)。在堆栈上而不是堆上分配点会导致指针悬空。该类是Allegro 4.2调用calc_spline
和spline
的外观。Allegro为x值返回一个int
s数组,为y值返回一个int
s数组。我想我可以按x值对它们进行排序,因为这是一条贝塞尔(sp?)曲线,理论上所有的点都是不同的。谢谢。std::binary\u search
是有史以来命名最差的函数。大多数人认为二进制搜索算法是返回找到的项目,但是binary\u search
只返回bool-“是的,它就在那里”。改为使用std::lower_bound
。@标记:通常是的,但这里使用的所有结果都是将其与结束迭代器进行比较。因此,无论名称如何,《二进制搜索》
正是这项工作的工具。这几乎是多余的,但不是完全多余的,因为在这个范围内有多个相等的值的情况下,二进制搜索可能会在找到任何一个值时立即退出,而(上下)界
必须找到第一个/最后一个。好的一点,史蒂夫,请忽略我的咆哮。还请注意,下限
的结果不能仅与结束
进行比较,它可能会将迭代器返回到插入的位置,因此您必须检查项目是否与搜索条件匹配。我有自己的短包装函数来实现这一点。该类是Allegro 4.2调用calc_spline
和spline
的外观。Allegro为x值返回一个int
s数组,为y值返回一个int
s数组。我想我可以按x值对它们进行排序,因为这是一条贝塞尔(sp?)曲线,理论上所有的点都是不同的。谢谢。std::binary\u search
是最不得名的乐趣