Отсортировать контейнер по модулю. Как работает 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 шт):
Все просто...
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;
}
Коротко и вполне понятно.
Вам нужно просто читать что пишете. Вот отрывок из вашего кода:
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;
}
Это если вы хотите сортировать от большего к меньшему. В обратном случаи поменяются знаки в возвращаемом выражении.