struct

时间:2016-11-12 19:41:02

标签: c++ vector stl

比如我说:

 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是正确的方法,但我很难写它。感谢您的帮助或指导!

1 个答案:

答案 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<())你可以有三次重载。)