2012-07-08 2 views
-1

В отличие от lower_bound, upper_bound не возвращает итератор элементу, если он сравнивается с значением, но только если он сравнивает строго больше.C++ STL Алгоритмы upper_bound(), которые не являются строго большими

Есть ли альтернатива, если мне нужен алгоритм upper_bound, который больше или равен.

+2

... 'lower_bound()' ? – quasiverse

+0

-1 вопрос непонятен. вы говорите, что хотите больше или равно. вы имеете в виду первый элемент, который больше или равен стоимости, которую вы даете? или последний элемент больше или равен значению, которое вы даете? или * any * item больше или равно значению, которое вы даете? эти имена и контракты этих функций уже очень запутывают, поэтому, пожалуйста, будьте очень точны в отношении того, что вы просите. –

ответ

1

Вы можете уменьшить итератор на 1.

auto begin = ...; 
auto end = ...; 
auto it = std::upper_bound(begin, end, target); 
if (it == begin) 
    return it; 
-- it; 
if (*it < target) 
    return ++it; 
else 
    return it; 

Положение итератора будет выглядеть следующим образом, предположим, что вы ищете 2:

1 1 1 2 2 2 2 3 3 3 3 
    ^ ^^ 
     lb | ub 
      this function 


1 1 1 1 3 3 3 3 
     ^
     lb & ub & this function 
+1

Не можете ли вы просто использовать 'lower_bound()'? – quasiverse

+0

Надеюсь, что в STL уже есть что-то, но это неплохая альтернатива. – user788171

+0

@quasiverse: он отличается от 'lower_bound()', когда есть несколько появлений цели (т. Е. Когда 'std :: equal_range()' не возвращает пустой диапазон). См. Обновленную цифру. – kennytm

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