[英]Searching for a range [x,y] in a sorted vector in C++ [using lower_bound() and upper_bound() ]
[英]lower and upper_bound on sorted vector of struct
比如说我有:
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”获得此向量的lower_bound和upper_bound。 例如,如果让我希望所有对象位于my_value的[low,high]范围内,则我希望lower_bound指向该bound(low)中的最低对象,而upper_bound指向我的high(高)。
到目前为止,我尝试过的是...
auto low = lower_bound(myvec.begin()->my_value, my_vec.end()->my_value, val);
对于上限,除了“ upper_bound”而不是“ lower_bound”之外,还有相同的事情。 如何从句法上实现这一目标? 对对象的向量进行排序后,我想做的就是能够找到特定范围内的所有对象。 我相信lower_bound和upper_bound是解决此问题的正确方法,但是我对编写它感到困惑。 感谢您的帮助或指导!
有两种方法。 您可以构造一个包装了所需值的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
my_stuff::operator<()
有三个超载)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.