Отсортировать контейнер по модулю. Как работает sort?

Выполнял задание по отсортировке массива состоящего из целых чисел по модулю. Решение через функцию abs видел. До того как обратиться к интернету, попробовал сам и вышло это:

#include "pch.h"
#include <iostream>
#include <vector>
#include <algorithm>

bool modul(int a, int b) {
    if (a > 0 && b > 0) {
        return (a > b);
    }
    else if (a < 0 && b < 0) {
        if (-1 * a > -1 * b) {
            return (a > b);
        }
        else if (-1 * a < -1 * b) {
            return (a < b);
        }
    }
    else if (a < 0 && b > 0) {
        if (-1 * a > b) {
            return (a > b);
        }
        else if (-1 * a < b) {
            return (a < b);
        }
    }
    else if (a > 0 && b < 0) {
        if (a > -1 * b) {
            return (a > b);
        }
        else if (a < -1 * b) {
            return (a < b);
        }
    }
}

int main() {
    int q = 0;
    std::cin >> q;
    std::vector<int> modul_sort;
    for (std::size_t index1 = 0; index1 < q; index1++) {
        int n = 0;
        std::cin >> n;
        modul_sort.push_back(n);
    }
    std::sort(modul_sort.begin(), modul_sort.end(), modul);
    for (const auto& item : modul_sort) {
        std::cout << item << " ";
    }
    std::cout << std::endl;
    return 0;
}

У меня ничего не получилось. Но вот нет понимания, что именно пошло не так. Я наверное просто не понимаю как работает sort или bool функции или ещё что-то. Прошу, подскажите где я напортачил?


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

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

Все просто...

std::sort(modul_sort.begin(), modul_sort.end(), 
    [](int a, int b){ return abs(a) < abs(b); });

Если вы не хотите использовать abs, то напишите его самостоятельно. Ну не стоит в любом случае развешивать длинные макароны из if'ов...

bool modul(int a, int b) 
{
    if (a < 0) a = -a;
    if (b < 0) b = -b;
    return a < b;
}

Коротко и вполне понятно.

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

Вам нужно просто читать что пишете. Вот отрывок из вашего кода:

 else if (a < 0 && b < 0) {
    if (-1 * a > -1 * b) {
        return (a > b);
    }

Словами означает: если а и b имеют отрицательное значение, то в случаи, если -1 * a > -1 * b(а это то же самое, что a < b) вернуть (a > b). Согласитесь, что это то же самое, что просто вернуть false. Никакого сравнения у вас не произойдет. Подобные ошибки у вас почти везде. Вместо этого вы могли бы просто проверить на отрицательность значения каждого по отдельности и написать:

bool modul(int a, int b) {    
    if (a <= 0) {
        if (b >= 0)
            return -a > b;
        else
            return  a < b;
    }
    else {
        if (b < 0)
            return a > -b;
    }
    return a > b;     
}

Это если вы хотите сортировать от большего к меньшему. В обратном случаи поменяются знаки в возвращаемом выражении.

→ Ссылка