Давайте потратим секунду, чтобы логически пройтись по коду здесь, так как я предполагаю, что это домашнее задание, важно понять, как это сделать. Существуют такие инструменты, как отладчики, которые используются в более крупных проектах и для более сложных задач, но небольшие логические ошибки, подобные этой, случаются постоянно.
Хорошо, поэтому insertfast()
- это функция для вставки int
в vector<int>
упорядоченным образом. Первое, что вы делаете, сравниваете первый и последний элементы вектора.
if (c >= v[v.size() - 1])
v.push_back(c);
if (c <= v[0])
v.insert(v.begin(), c);
Мы можем быть только одной из этих вещей, и если они верны, мы закончили. Так что лучший вариант здесь - просто return
из функции, нам больше не нужно ничего делать. Мы знаем это, но программа не знает. Он будет продолжать сравнивать вещи, которые мы не хотим сравнивать и выдавать ошибки.
if (c >= v[v.size() - 1]) {
v.push_back(c);
return;
}
if (c <= v[0]) {
v.insert(v.begin(), c);
return;
}
Что если оба эти утверждения ложны, и мы все еще в функции? Нам все еще нужно выяснить, куда вставить это значение, поэтому мы перебираем элементы.
while (v.size() != 9)
Это очень плохой условный цикл, так как он будет только работать, если мы передадим в функцию вектор размера 8. С вашей конкретной арифметикой вы, по сути, хотите цикл, пока какое-либо значение не будет добавлено к вектору. Я рекомендую безусловный цикл (в конце концов, мы пытаемся быть "быстрым"), то есть бесконечный цикл, и явно возвращаем или перерыв в цикле.
int min = 1;
int max = v.size();
while (1) {
int i = (min + max) / 2;
if (v[i - 1] <= c && c <= v[i]) {
v.insert(v.begin() + i, c);
return;
}
if (v[i] <= c && c <= v[i + 1]) {
v.insert(v.begin() + (i + 1), c);
return;
}
if (c < v[i])
max = i;
else
min = i;
}
break
вместо return
также будет работать нормально, так как если вы выйдете из этого цикла, конец функции будет достигнут, и вы просто вернетесь в любом случае. Итак, мы решили проблему, просто переосмыслив дизайн и пошагово пройдя код.