比如我说:
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”获取此向量的lower_bound和upper_bound。例如,如果我得到了my_value范围[low,high]范围内的所有对象,我希望我的lower_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是正确的方法,但我很难写它。感谢您的帮助或指导!
答案 0 :(得分: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::less_than()
(而不是单独的比较器),则可以进一步避免将std::lower_bound
传递给std::sort
(以及my_stuff::operator<()
)你可以有三次重载。)