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

时间:2018-03-06 16:04:13

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

您可以使用std::lower_bound which takes a custom comparator的版本(链接上标有“(2)”的版本);你会写一个矢量比较器,它按照第一个项目(或者你喜欢的其他方式)来比较矢量。

Howerver:

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

答案 1 :(得分:1)

我不确定你的内心事物应该是std::vector - 3个元素。 我相信他们应该std::array - 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]));