Сравнение массивов в 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 шт):
где то так
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
Если экземпляры 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;
}