如何在向量向量上使用lower_bound?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在向量向量上使用lower_bound?相关的知识,希望对你有一定的参考价值。

我是C ++的新手,我没有什么问题。我有向量,在该向量中是具有3个整数的向量。

内部矢量代表一个人。内部向量内部的3个整数表示距起点,速度和原始索引的距离(因为在输入整数中没有排序,在输出中我需要在此有序向量中打印原始索引而不是索引)。

现在我已经给出了一些代表起点距离的点,我需要找到那个人在那一点上的第一个,所以我一直在想我的第一步是找到最接近给定点的人,所以基本上我需要找到LOWER_BOUND / UPPER_BOUND。

如果我想在内部向量中找到第一项的lower_bound,我该如何使用lower_bound?或者我应该使用struct / class而不是内部向量?

答案

您将使用std::lower_bound which takes a custom comparator的版本(链接上标记为“(2)”的版本);你会写一个矢量比较器,用它们的第一个项目(或你喜欢的任何其他方式)比较矢量。

然而:

  • 正如@doctorlove指出的那样,std::lower_bound不会将矢量相互比较,而是将它们与给定值(无论是向量还是标量)进行比较。所以你可能真的想做别的事情。
  • std::vector中保持固定长度的元素序列通常不是一个好主意。你考虑过std::array吗?
  • 您的“具有3个整数的向量”很可能实际上代表其他东西,例如三维几何空间中的点;在这种情况下,是的,他们应该在某种类别。
另一答案

我不确定你的内心事物应该是3个元素的std::vector-s。我相信他们应该std::array-s的3个元素(因为你知道大小是3并且不会改变)。

所以你可能想拥有

 typedef std::array<double,3> element_ty;

然后使用std::vector<element_ty>,其余的(你的lower_bound点)在einpoklum's answer中做。

顺便说一句,您可能希望使用std::min_element进行显式比较。

也许你想要的东西:

std::vector<element_ty> vec;
auto minit = 
    std::min_element(vec.begin(), vec.end(),
                     [](const element_ty& x, const element_ty&y) {
                        return x[0] < y[0])); 

以上是关于如何在向量向量上使用lower_bound?的主要内容,如果未能解决你的问题,请参考以下文章

Lower_bound 不适用于具有 3 个元素的向量的最后一个元素

如果我们有对向量,如何进行下界二分搜索

vector 牛逼 +lower_bound+ upper_bound

在一组三个向量中找到最接近的三元组?

什么是中断向量

关于Unity中顶点片元Shader实例