lower 和 upper_bound 在结构的排序向量上

Posted

技术标签:

【中文标题】lower 和 upper_bound 在结构的排序向量上【英文标题】:lower and upper_bound on sorted vector of struct 【发布时间】:2016-11-12 19:41:01 【问题描述】:

比如说我有:

 struct my_stuff
     long my_value;

     struct less_than
           bool operator()(const my_stuff &a, const my_stuff &b)
                   return a.my_value < b.my_value;
     ;
 ;

在我的代码中:

  vector<my_stuff> my_vec;

这个向量已经包含了我感兴趣的所有对象。然后我根据 my_value 成员变量对我的向量进行了排序

  sort(my_vec.begin(), my_vec.end(), my_stuff::less_than());

到目前为止一切都很好。现在,我的具有成员变量“my_value”的对象向量现在根据“my_value”的值进行排序。

我的问题/问题是:如何根据“my_value”获取此向量的下界和上界。例如,如果给定我想要 my_value 的 [low, high] 范围内的所有对象,我希望我的 lower_bound 指向该边界(低)中的最低对象,而我的 upper_bound 指向我的高。

到目前为止我尝试过的是......

 auto low = lower_bound(myvec.begin()->my_value, my_vec.end()->my_value, val);

除了使用“upper_bound”而不是“lower_bound”之外,上限也一样。我如何在语法上实现这一点?在对对象向量进行排序后,我想要做的是能够找到一定范围内的所有对象。我相信 lower_bound 和 upper_bound 是解决这个问题的正确方法,但我很难写它。感谢您的任何帮助或指导!

【问题讨论】:

只是备注:你可以去掉struct less_than,而是在my_stuff中实现小于运算符 【参考方案1】:

有两种方法。您可以构造一个 my_stuff 的实例来包装所需的值,然后将其传递给 lower_bound

my_stuff test; test.my_value = val;
auto low = std::lower_bound(time_table.begin(), time_table.end(), test, 
                            my_stuff::less_than());

或者,向less_than::operator() 添加几个重载,一侧采用my_stuff,另一侧采用long。有了一个支持异构比较的比较器,你可以写

auto low = std::lower_bound(time_table.begin(), time_table.end(), val,
                            my_stuff::less_than());

如果您实现 my_stuff::operator&lt;() 而不是单独的比较器,则可以进一步避免将 my_stuff::less_than() 传递给 std::lower_bound(以及 std::sort)(您可以有三个重载) .

【讨论】:

以上是关于lower 和 upper_bound 在结构的排序向量上的主要内容,如果未能解决你的问题,请参考以下文章

Java实现 lower_bound() 和 upper_bound()

关于lower_bound( )和upper_bound( )的常见用法

二分检索函数lower_bound()和upper_bound()

关于lower_bound()和upper_bound()

stl map中的lower_bound和 upper_bound

徒手实现lower_bound和upper_bound