Вектор сортировки (Bubble sort) c ++ - PullRequest
0 голосов
/ 04 мая 2020

У меня есть класс Date, функции bubbleSort, isAfter и printVector. Итак, моя задача: использовать функцию bubbleSort для сортировки объектов векторного типа Date (используя функцию isAfter, которая сравнивает даты). Я что-то сделал, но это не работает, так может кто-нибудь помочь мне с этим? Функция Bubble sort (не работает с "Date", отлично работает с целыми числами, строками ...). Вот мой код:

//isAfter
template<>
bool isAfter(const Date &first, const Date &second) {
    if (first.getYear() == second.getYear()) {
        if (first.getMonth() == second.getMonth()) {
            if (first.getDay() == second.getDay()) {
                cout << first.toString() << " is equal to " << second.toString() << endl;
                return false;
            } else if (first.getDay() > second.getDay()) {
                cout << " " << first.toString() << " is after " << " " << second.toString() << endl;
                return true;
            } else if (first.getDay() < second.getDay()) {
                cout << " " << second.toString() << " is after " << " " << first.toString() << endl;
                return true;
            }
        } else if (first.getMonth() > second.getMonth()) {
            cout << " " << first.toString() << " is after " << " " << second.toString() << endl;
            return true;
        } else if (first.getMonth() < second.getMonth()) {
            cout << " " << second.toString() << " is after " << " " << first.toString() << endl;
            return true;
        }
    } else if (first.getYear() > second.getYear()) {
        cout << " " << first.toString() << " is after " << " " << second.toString() << endl;
        return true;
    } else if (first.getYear() < second.getYear()) {
        cout << " " << second.toString() << " is after " << " " << first.toString() << endl;
        return true;
    }
    return false;
}

//bubbleSort
template<typename T>
void bubbleSort(vector<T> &vec) {
    bool swapp= true;
    while (swapp) {
        swapp= false;
        for (unsigned int i = 0; i < vec.size()- 1; i++) {
            if (vec[i] > vec[i + 1]) {
                swap(vec[i], vec[i + 1]);
                swapp = true;
            }

        }
    }
}

так как я могу добавить isAfter в bubbleSort для нормальной работы с объектами "Date"?

1 Ответ

2 голосов
/ 04 мая 2020

Если это всегда порядок сортировки дат, и вы управляете этим типом, вы можете реализовать операторы сравнения operator<, operator>, operator<=, operator>=, operator== и operator!= для этого типа. .

В противном случае традиционный подход состоит в том, чтобы модифицировать алгоритм сортировки так, чтобы он принимал пользовательский компаратор (по соглашению, имеющий интерфейс operator<, который требует от вас сравнения) из вызывающих, что-то вроде:

template <typename T, typename Compare>
void bubbleSort(vector<T> &vec, Compare compare) {
  // as you currently have, but using compare(a, b) instead of a < b
}

template <typename T>
void bubbleSort(vector<T> &vec) {
  bubbleSort(vec, std::less<>());
}

Тогда вызывающие абоненты могут использовать isAfter следующим образом:

bubbleSort(dates, [](const Date& a, const Date& b) { return isAfter(b, a); });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...