Я изучаю итераторы и застрял в течение 3-х дней на выяснение того, почему мы используем:Двоичный поиск с использованием итераторов, почему мы используем «(end-begin)/2»?
auto mid = text.begin() + (end - beg)/2;
Код:
int main()
{
vector<int> text{ 10,9,8,7,6,5,4,3,2,1 };
int sought = 3;
// text must be sorted
// beg and end will denote the range we're searching
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg)/2; // original midpoint
// while there are still elements to look at and we haven't yet found sought
while (mid != end && *mid != sought) {
if (sought < *mid) // is the element we want in the first half?
end = mid; // if so, adjust the range to ignore the second half
else // the element we want is in the second half
beg = mid + 1; // start looking with the element just after mid
mid = beg + (end - beg)/2;// new midpoint
}
system("pause");
}
почему
auto mid = text.begin() + (end - beg)/2;
и нет:
auto mid = text.begin() + text.size()/2;
Пожалуйста, помогите.
ли *** мы *** использование "(конец - начало)/2"? Где ты нашел это? – Wolf
@ Wolf - C++ primer 5th edition. Его немного вводит в заблуждение, поскольку книга в главе 3.4 говорит, что это «классический алгоритм», поэтому я предположил, что это было обычное явление (исправьте меня, если я ошибаюсь) – jibzoiderz
Причина, по которой это путает, заключается в том, что в примере реализуется двоичный поиск внутри основная функция. Если он был правильно извлечен в функцию, для которой требуется только диапазон итераторов для поиска, было бы понятно, почему вы не можете назвать размер в контейнере, потому что у вас нет способа ссылаться на контейнер. –