Вы выполняете операцию обмена после завершения i
l oop, где i
теперь установлено на words.size()
. Поскольку допустимые индексы имеют значения от 0
до words.size() - 1
включительно, это приводит к возникновению ошибки за пределами допустимого диапазона.
Вам необходимо переместить операцию подкачки в внутри , что l oop :
void alpha(vector <string>& words) {
// For each possible position in the collection.
for (int i = 0; i < words.size(); ++i) {
// Locate next lowest element (it should be in that position).
int minPos = i;
for (int k = i + 1; k < words.size(); ++k) {
if (words.at(minPos) < words.at(k)) {
minPos = k;
}
}
// If not already there, swap it with what is there.
if (i != minPos) {
string temp = words.at(minPos);
words.at(minPos) = words.at(i);
words.at(i) = temp;
}
}
}
Вы также увидите несколько других улучшений:
- сведение к минимуму области видимости переменных там, где они должны использоваться (если бы вы сделали это с
i
, было бы невозможно скомпилировать ваш неверный код). - нет выполнения ненужной операции подкачки, если правильный элемент уже в правильном месте.
- исправление небольшой ошибки в способе определения, должен ли более поздний элемент переопределять текущий (в основном, с использованием
minPos
вместо i
). - добавление комментариев. Я не могу не подчеркнуть, что это почти всегда то, что нужно сделать сначала при кодировании.
В качестве отступления, я могу только предположить, что это классная работа, поскольку никто в здравом уме (a) не выберет ручной метод, когда в стандартной библиотеке есть что-то более подходящее:
std::sort (words.begin(), words.end());
И только одна небольшая нота Вы используете переменную minPos
, но ваш реальный код сравнения отсортирует массив от наибольшего к наименьшему. Поэтому вам следует назвать это maxPos
или изменить сравнение на противоположный смысл (сортировку от наименьшего к наибольшему с помощью >
).
(a) Так что очевидно без учителей: -)