【问题标题】:How to use lower_bound on vector of vectors?如何在向量的向量上使用 lower_bound?
【发布时间】:2018-03-06 16:04:13
【问题描述】:

我在 C++ 方面相对较新,我没有什么问题。我有向量,并且在该向量中是具有 3 个整数的向量。

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

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

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

【问题讨论】:

  • 你想搜索外部向量以找到每个中第一项的下限吗?还是别的什么?
  • @doctorlove 是的,我想搜索外部向量以找到每个内部向量中第一项的下限
  • @Snip3r:你的问题真的不清楚。请编辑您的问题以改进它,但不要发表评论。要么添加几句话来解释你的目标,要么添加一些minimal reproducible example。阅读有关std::lower_bound 的更多信息,它可能没有按照您的想法行事。
  • 外向量是否正确分区? “范围[first, last) 必须根据表达式element < valuecomp(element, value) 进行分区。完全排序的范围符合此标准。”。鉴于您不知道要使用什么 comp,它可能不是
  • @Caleth 是的,我的向量是按内部向量的第一个值排序的,我有自定义函数来排序,但似乎不适用于 lower_bound。

标签: c++ c++11 vector comparison c++-standard-library


【解决方案1】:

您将使用std::lower_bound which takes a custom comparator 的版本(链接中标有“(2)”的版本);然后你会写一个向量比较器,通过它们的第一项(或你喜欢的任何其他方式)来比较向量。

但是:

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

【讨论】:

  • "在您的情况下,它将是一个具有单个元素的向量" 比较的值可以是任何东西,例如std::lower_bound(outer.begin(), outer.end(), 42, [](auto & vec, int value) { return vec[0] < value; })
【解决方案2】:

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

所以你可能想要拥有

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

然后使用std::vector&lt;element_ty&gt; 其余部分(您的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])); 

【讨论】:

  • 我们并不真正了解 OP 真正想要什么。这是一个有根据的猜测。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多