gpt4 book ai didi

c++ vector 的最小值大于另一个值

转载 作者:太空狗 更新时间:2023-10-29 23:44:13 27 4
gpt4 key购买 nike

我有一个 vectordouble。我希望找到两者:

  • vector 中大于(或等于)值 x 的最小值。
  • vector 中小于(或等于)值 x 的最大值。

例如如果我有一个 vector :

std::vector<double> vec = {0, 1.0, 3.0, 4.0, 5.0};

和一个值

x = 2.6;

我希望找到 1.03.0

最有效的方法是什么?

我有这样的东西:

double x1, x2; // But these need to be initialised!!!
double x = 2.6;
for (i = 0; i < vec.size(); ++i)
{
if (vec[i] >= x && vec[i] < x2)
x2 = vec[i];
if (vec[i] <= x && vec[i] > x1)
x1 = vec[i];
}

但是我怎样才能初始化 x1 和 x2?我可以使 x2 成为 vector 的最大值,x1 成为最小值,但这需要对数据进行初始传递。有什么方法可以更有效地做到这一点?

编辑:

我认为我可以/不能对数据做出一些假设:

  • 没有负数(即最小可能数为 0)
  • 它不一定是排序的。

最佳答案

您可以使用 std::lower_bound :

#include <iterator>
#include <algorithm>

template<class ForwardIt, class T>
std::pair<ForwardIt, ForwardIt> hilo(ForwardIt first, ForwardIt last, T const &value)
{
if (first != last)
{
auto lb = std::lower_bound(first, last, value);
auto prelbd = std::distance(first, lb) - 1;
if (lb == last) return{ std::next(first, prelbd), last };
if (!(value < *lb)) return{ lb, lb };
if (lb == first) return{ last, first };
return{ std::next(first, prelbd), lb };
}
return{ last, last };
}

可以这样使用:

std::vector<double> vec = { -1.0, -1.0, 0.0, 1.0, 3.0, 3.0, 3.0, 3.0, 4.0, 5.0, 5.0 };
// if not ordered
//std::sort(vec.begin(), vec.end());
double x = 5.0;
auto b = hilo(vec.begin(), vec.end(), x);
if (b.first != vec.end())
{
std::cout << "First index: " << std::distance(vec.begin(), b.first)
<< "(value " << *b.first << ")\n";
}
if (b.second != vec.end())
{
std::cout << "Second index: " << std::distance(vec.begin(), b.second)
<< "(value " << *b.second << ")\n";
}

关于c++ vector 的最小值大于另一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33955848/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com