Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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++ 如何在排序列表中找到距离大于19.0f的第一个元素?_C++_Algorithm_Stl - Fatal编程技术网

C++ 如何在排序列表中找到距离大于19.0f的第一个元素?

C++ 如何在排序列表中找到距离大于19.0f的第一个元素?,c++,algorithm,stl,C++,Algorithm,Stl,在std::pair的已排序列表中,按距原点的距离按升序排序 pair<float,float> origin; list<pair<float,float> > points; float distance=19.0f; 如何在列表中找到距离大于距离19.0f的第一个元素? 如何应用列表二进制搜索?迭代不够有效,列表太长? 还有更优雅的解决方案吗 不能在链表上进行二进制搜索。考虑用向量或多集替换它。 一个列表并不适合二进制搜索。这是因为您只能按顺序访问列表

在std::pair的已排序列表中,按距原点的距离按升序排序

pair<float,float> origin;
list<pair<float,float> > points;
float distance=19.0f;
如何在列表中找到距离大于距离19.0f的第一个元素? 如何应用列表二进制搜索?迭代不够有效,列表太长?
还有更优雅的解决方案吗

不能在链表上进行二进制搜索。考虑用向量或多集替换它。

一个列表并不适合二进制搜索。这是因为您只能按顺序访问列表中的元素,您只能从元素k-1访问元素k,因此,如果必须使用列表,则除了线性搜索大于距离的第一个元素外,别无选择


如果您想进行二进制搜索,您可以使用允许直接访问myvector[i]

中元素的容器,因为随机访问时间已开启,而二进制搜索需要O1才能正常工作,因此无法高效地对链表执行二进制搜索

您需要遍历列表,没有其他方法,除非您选择不同的数据结构。

使用。如前所述,二进制搜索不能用于std::list,因为您无法访问列表中的随机元素。

您可以使用它在正则向量上实现有序容器的语义

如何在列表中找到距离大于距离19.0f的第一个元素?如何应用列表二进制搜索?迭代不够有效,列表太长

正如其他几个回答者所说,二进制搜索在std::list上不起作用;但是,如果您将列表更改为向量,那么您要查找的算法就会拼写出来

下面是你想知道的部分:

// find first element with distance bigger than 19.0f
auto it = std::partition_point(
    points.begin(), points.end(),
    [&](const auto& pt) {
        return distance_between(origin, pt) < 19.0f;
    }
);
返回的迭代器将是这样的:

if (it > points.begin()) {
    assert(distance_between(origin, *(it-1)) < 19.0f);
}
if (it < points.end()) {
    assert(distance_between(origin, *it) >= 19.0f);
}

您需要一个像std::vector这样的随机访问容器来进行二进制搜索。因此,恐怕无法在std::list上进行二进制搜索。也许你应该用std::multiset来代替?@john:如果不需要重复的话,可能只是一个set。
if (it > points.begin()) {
    assert(distance_between(origin, *(it-1)) < 19.0f);
}
if (it < points.end()) {
    assert(distance_between(origin, *it) >= 19.0f);
}