2012-05-12 2 views
4

У меня есть следующий код, который отлично работает.с использованием STL Container set upper_bound

Цель: указать число n, найти следующее и предыдущее число n.

Основание на примере ниже: если n = 50, то я получу 60 и 40 отдельно.

Я могу получить 60, используя upper_bound. Но как мне получить число до 50, я не могу найти предоставленный алгоритм для этого.

set<int> myset; 
set<int>::iterator it,itlow,itup; 

for (int i=1; i<10; i++) myset.insert(i*10); // 10 20 30 40 50 60 70 80 90 
itup=myset.upper_bound (50);     // 
cout << "upper_bound at position " << (*itup) << endl; 
    //output: 60 

Со ссылкой на http://www.cplusplus.com/reference/stl/set/lower_bound/, он говорит upper_bound «Возвращает итератор, указывающий на первый элемент в контейнере, который не сравнить меньше х», но я уверен, есть что-то еще, что указывает на то, что сравнить меньше, чем x.

Заранее благодарен! :)

+3

Как насчет 'lower_bound'? – chris

ответ

6
it = myset.lower_bound(50); 
--it; 

Конечно, не разыменования этого итератора, если вы не уверены, что там является элемент меньше, чем 50 в задавать. Вы можете проверить, есть ли для этого it == myset.begin().

+0

Что делать, если 50 нет в комплекте? –

+0

теперь я чувствую себя настолько глупо. все, что мне нужно было сделать, это использовать «--itup»; 2 раза, чтобы добраться до нижнего диапазона. благодаря! – mister

+0

@AlanStokes по-прежнему будет идти в верхний или нижний диапазон, если требуется. который равен 60 и 40 соответственно – mister

1

Использование lower_bound как chris говорит см. Sgi: http://www.sgi.com/tech/stl/lower_bound.html и MSDN: http://msdn.microsoft.com/en-us/library/awxks70z%28v=vs.80%29.aspx.

lower_bound вернет позицию, в которой произойдет вставка, чтобы заказ поддерживался именно так, как вы хотите.

Так

itlow = myset.lower_bound (50); // check if this is not pointing to myset.end() 
--itlow; // should still check if this is in your container really 
cout << "upper_bound at position " << (*itup) << "lower bound" << (*itlow) << endl; 

лучший вариант я думаю

// check whether lower_bound returns myset.end() or myset.begin() for sensible and safe assignment 
if (myset.lower_bound(50) != myset.end() && myset.lower_bound(50) != myset.begin()) 
{ 
    itlow = myset.lower_bound(50); 
    --itlow; 
} 
1

Вы хотите lower_bound(49). Или, возможно, сделайте lower_bound(50) и будьте готовы вернуться, если потребуется.

+1

Не вернул бы ли он 50 на lower_bound (49)? – mister

+0

Gah, да. Он возвращает первое значение> = параметр. Так что да, lower_bound (50) и обратно один *, если есть предыдущий элемент *, является ответом. Эти два меня всегда путают :-( –

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