Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 更好的std::在指针集合上查找并将解引用值与常量引用值进行比较_C++_Search_Find_Std - Fatal编程技术网

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
是最不得名的乐趣