Сравнение массивов в std::array

Реализую класс, аналогичный std::array. Одним из пунктов является перегрузка операторов сравнения массивов одинаковой длины (лексикографическое). С операторами == и != все понятно, но как работают <=, >=, <, >? Вот мой вариант и он неверный. Подскажите, что я делаю не так и как исправить ситуацию?

    bool operator< (Array const& v1, Array const& v2) {
        bool res = false;
        int i = 0;
        while (v1[i] == v2[i]) {
            ++i;
        }
        if (v1[i] < v2[i]) {
            res = true;
        }
        return res;
    }

Остальные операторы сделал по той же логике.


Ответы (2 шт):

Автор решения: KoVadim

где то так

bool operator< (Array const& v1, Array const& v2) {
    for (int i = 0; i < v1.size(); i++) {
      if (v1[i] < v2[i]) return true; // нашли элемент, который больше, готово, выходим
      if (v1[i] > v2[i]) return false; // условие точно не выполняется, уходим
      // элементы одинаковые. крутим массив дальше
    }
    return false; // массивы оказались одинаковыми. что ж.
}

ну а если нет запрета на стандартную библиотеку, то можно посмотреть на std::mismatch

→ Ссылка
Автор решения: Stanislav Volodarskiy

Если экземпляры Array могут иметь разные размеры, то надо учесть возможность что один массив окажется короче другого. В примере ниже Array::size возвращает размер массива (почему-то int). Цикл надо прогнать до минимума размеров обоих массивов. Если разница до сих пор не найдена, то надо анализировать длины массивов. Массив меньшей длины в такой ситуации считается меньшим в лексиграфическом смысле:

bool operator <(Array const& a, Array const& b) {
    int const min_size = std::min(a.size(), b.size());
    for (int i = 0; i < min_size; ++i) {
        if (a[i] < b[i]) {
            return true;
        }
        if (b[i] < a[i]) {
            return false;
        }
    }
    return b.size() > min_size;
} 
→ Ссылка