c++ - std函数下限不能按预期工作吗?

标签 c++

我试图获得一种方法来将最接近的值返回到0.5,并使用std::lower_bound。为什么这会返回错误的值,而该值甚至不在数组中?更糟糕的是,如果我连续运行多次,它将返回不同的答案。我所能想到的是,它在某种程度上与浮点数和小数点相关,但我无法将其固定下来。谢谢你的帮助!

#include <iostream>     
#include <algorithm>       
#include <vector> 


int test() {


float array[] = {0.730453, 0.699215, 0.669218, 0.637146, 0.604049, 0.572716, 0.541121, 0.50986, 0.47848, 0.449675, 0.419725, 0.3908, 0.363951, 0.338627, 0.312707, 0.289863, 0.26578, 0.244605, 0.224265, 0.204569, 0.185969, 0.169755, 0.155114, 0.140401, 0.126714, 0.115817, 0.104347, 0.0945466, 0.000119226, 9.53812e-05, 9.53812e-05, 7.15359e-05};   
std::vector<float> v(std::begin(array),std::end(array));
std::reverse(std::begin(array),std::end(array));
std::vector<float>::iterator low, up;
low=std::lower_bound (v.begin(), v.end(), 0.5);

std::cout << "lower_bound at position " << (low- v.begin()) << '\n';
std::cout<<"index of thing is "<<low- v.begin()<<endl;
float & element = v[low- v.begin()];
std::cout<<"element closest to 0.5 is "<< element<<endl;
return 0;

            }

最佳答案

您的 vector 需要按lower_bound排序,以返回正确的结果。如果未排序,则调用lower_bound会调用未定义的行为。
因此,在调用lower_bound之前,您需要执行以下操作:

std::sort(v.begin(), v.end());
这是demo
看来array是按相反的顺序排序的。因此,在构造v之前,您需要反转array,而不是在之后。
std::reverse(std::begin(array),std::end(array));  // first reverse
std::vector<float> v(std::begin(array),std::end(array));
然后,无需对v进行排序。
另外,除了反转arrayv之外,您还可以使用反向迭代器:
std::lower_bound (v.rbegin(), v.rend(), 0.5);
或使用其他谓词:
std::lower_bound (v.begin(), v.end(), 0.5, std::greater{});

关于c++ - std函数下限不能按预期工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62676993/

相关文章:

c++ - 包含未定义行为的源代码使编译器崩溃是否合法?

C++ - 在保持灵活代码的同时处理隐式/显式转换

c++ - 生成的 TeX 文件中有问题的 '\\+' 序列

c++ - 设置缓冲区参数时的 CL_INVALID_ARG_VALUE

c++ - 共享或私有(private) openmp 代码中的结构化类型变量

c++ - read() 和 getc() 有什么区别

c++ - 为什么一个类允许拥有自己的静态成员,而不是非静态成员?

c++11 使用 std::swap 与 operator=(T&&) 清除容器

c++ - 将 .o(C 目标文件)链接到 Linux 上的 C++ 文件/项目

c++ - 通过数组排序 C++