Проблема, как уже говорили другие, заключается в следующем разделе кода:
for (int i=0; i<=(x.size()); i++)
{
//if the level in the first is greater than the level in the next
if(x[i].level > x[i+1].level)//I get a fatal error here when it tries to compare
//the iterator with 1 that's outside its range
A std::vector
можно индексировать значениями от 0 до size() - 1
включительно. Итак, для базового цикла vector
вы должны вместо этого сделать
for (int i = 0; i < x.size(); i++) {
НО, в следующей строке кода вы проверяете элемент i + 1, поэтому вы должны вместо этого сделать
for (int i = 0; i < x.size() - 1; i++) {
НО, поскольку x.size () не имеет знака, если x пусто, тогда x.size() - 1
будет очень большим числом (2 ^ 32 - 1 на 32-разрядной машине). Таким образом, вы должны настроить логику для этого. Кроме того, сравнение значений со знаком (например, int i
и значений без знака (например, x.size() - 1
) может генерировать предупреждения компилятора (вы должны включить все такие предупреждения компилятора, если вы этого еще не сделали), поэтому измените i
на unsigned
или size_t
:
for (size_t i = 0; i + 1 < x.size(); i++) {
Наконец, вместо того, чтобы кодировать свою собственную сортировку пузырьков, лучше использовать std::sort
. std::sort
быстрее и более знаком для других разработчиков C ++. Вот (непроверенный) пример использования std::sort
:
bool CompareByLevel(const Fighter& a, const Fighter& b) {
return a.level < b.level;
}
sort(x.begin(), x.end(), CompareByLevel);
Другие комментарии: Если вам интересно узнать больше о C ++, вот несколько других комментариев, которые могут помочь.
inputFile >> line;
Это утверждение фактически читает одно слово, разделенное пробелами или символом новой строки, в line
. Если это то, что вы пытаетесь сделать, то ваш выбор имени переменной (line
) не говорит об этом. И вы можете захотеть использовать пробелы в именах бойцов. Чтобы прочитать всю строку, используйте это: (См. здесь для справки.)
getline(inputFile, line);
getEnemies
, printFighter
и sortFighters
должны быть методами static
, так как им не требуется конкретный экземпляр Fighter
для работы. (Прямо сейчас, поскольку они не являются статическими методами, вы должны создать enemy
экземпляр Fighter для вызова этих методов, даже если ни один из этих методов ничего не делает с enemy
.)
C ++ позволяет создавать переменные в стеке вместо их динамического распределения. Другими словами, вместо того, чтобы говорить
Fighter * temp = new Fighter;
просто скажи
Fighter temp;
Это быстрее и проще, если вам не нужно динамическое распределение.
Наконец, C ++ создаст для вас операторы присваивания, которые будут копировать всех членов класса. Так что вы можете просто написать
temp = x[i];
вместо того, чтобы вручную присваивать каждому члену x значение temp. Использование оператора присваивания более надежно, так как оно продолжит работать в будущем, если вы позже добавите членов к Fighter
.
Надеюсь, это поможет.