2016-11-12 4 views
0

Скажем, например, у меня есть:ниже и UPPER_BOUND на отсортированный вектор структуры

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». Например, если мне дали, что мне нужны все объекты в диапазоне [low, high] my_value, я бы хотел, чтобы мой 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 - правильный способ обойти это, но я не понимаю, как это писать. Спасибо за любую помощь или руководство!

+0

просто замечание: вы можете избавиться от '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::less_than() к std::lower_boundstd::sort, по этому вопросу), если вместо отдельного компаратора, вы реализуете my_stuff::operator<() (вас может иметь три перегрузки этого).

Смежные вопросы