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<()
而不是单独的比较器,则可以进一步避免将 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()