2015-02-01 1 views
-2

почему lower_bound(2) множества 0 дает 1 как результатПочему lower_bound дает значение, которое не входит в набор?

set<int> S; 
S.insert(0); 
cout<<*(S.lower_bound(2))<<endl; 

Я думаю, что он должен возвращать какой-то элемент, который находится в наборе

+1

[Потому что это так определено] (http://en.cppreference.com/w/cpp/algorithm/lower_bound) - на самом деле , ваш код просто недействителен, потому что вы разыскиваете недействительный итератор. –

+0

@KonradRudolph Это действительный итератор. Это просто не вызывает различий. –

ответ

4

От the documentation:

iterator lower_bound(const Key& key); 

Возвращает итератор, указывающий на первый элемент, который не менее чем ключ.

Ваш набор выглядит следующим образом:

std::set<int> s {0}; 

Таким образом, нет ни одного элемента, который не менее, чем 2. Поэтому s.lower_bound(2) возвращает s.end(). Вывод разыменования того, что итератор вызывает неопределенное поведение, которое в вашем случае дает вам 1.

5

lower_bound возвращает итератор. Если запрашиваемое вами значение отсутствует, оно возвращает итератор, который вы могли бы передать insert в качестве параметра hint (и получить установку с постоянной сложностью), что означает, что итератор ссылается на элемент, который будет сортироваться сразу после значения, которое вы попросил поискать.

Когда/если переданное вами значение больше любого значения в коллекции, оно вернет итератор .end() контейнера. Попытка разыменовать конечный итератор дает неопределенное поведение - оно не относится к какому-либо фактическому элементу.

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