Lower_bound не работает с последним элементом вектора с 3 элементами - PullRequest
0 голосов
/ 09 февраля 2020
vector<int> vec = {2,4,3};
vector<int>::iterator it;
it=lower_bound(vec.begin(),vec.end(),3);
cout<<*it;

Это возвращает результат 4, а не 3, а

vector<int> vec = {2,3,4};
vector<int>::iterator it;
it=lower_bound(vec.begin(),vec.end(),3);
cout<<*it;

Но это возвращает правильный вывод 3. Пожалуйста, помогите мне понять, почему он не работает в угловом случае.

Ответы [ 2 ]

1 голос
/ 09 февраля 2020

Согласно cppreference и документации std::lower_bound:

Возвращает итератор, указывающий на первый элемент в диапазоне [first, last), который не меньше чем (то есть больше или равно) значение или последний, если такой элемент не найден.

Итак, std::lower_bound возвращает первый элемент , который больше или равно значению (3 здесь).

Для {2, 4, 3} первый элемент, больший или равный 3, равен 4, а для {2, 3, 4,} - 3.

PS В соответствии с cppreference снова:

Диапазон [первый, последний) должен быть разделен относительно выражения element , т. е. все элементы, для которых выражение является истинным, должны предшествовать всем элементам, для которых выражение является ложным. Полностью отсортированный диапазон соответствует этому критерию.

Оба ваших вектора правильно разделены с условием (элемент <значение) </p>

0 голосов
/ 09 февраля 2020

Короче говоря, вектор {2,4,3} не соответствует требованиям lower_bound.

https://en.cppreference.com/w/cpp/algorithm/lower_bound говорит:

Диапазон [first, last) должен быть разделен по отношению к элементу выражения

Если ваш вектор не отсортирован, используйте std::find.

...