Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/34: Рейтинг темы: голосов - 34, средняя оценка - 4.68
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 104

Сортировка вектора векторов по модулю через лямбда функцию

12.01.2020, 18:06. Показов 6840. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста. Требуется отсортировать функцией sort вектор векторов через лямбда функцию. Я написал сортировку для вектора. Помогите для вектора векторов сделать. Заранее благодарю)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int main()
{
    setlocale(0, "RUS");
    unsigned int n;
    vector<int> v;
    cout << "введите размерность вектора: ";
    cin >> n;
    cout << "введите элементы вектора: " << endl;
    while (n){
        int num;
        cin >> num;
        v.push_back(num);
        --n;
    }
    sort(v.begin(), v.end(), [](int i, int j) 
        { 
            return (abs(i) < abs(j)); 
        });
    for (const auto& i : v){
        cout << i << " ";
    }
    return 0;
}
Добавлено через 2 часа 27 минут
Написал вот такую штуку, но всё ровно не работает(( подскажите что не так???

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include "pch.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
 
using namespace std;
 
const int N = 5;
 
int main()
{
    setlocale(0, "RUS");
    srand(time(NULL));
    vector<vector<int>> Matrix(N, vector<int>(N));
    for (size_t i = 0; i < N; i++) {
        cout << endl;
        for (size_t j = 0; j < N; j++) {
            cout << (Matrix[i][j] = rand() % 20 - 2) << "  ";
        }
    }
    cout << endl << "=======================" << endl;
 
    sort(Matrix.begin(), Matrix.end(), [] (const vector<int>& a, const vector<int>& b) {return (abs(a[1]) < abs(b[1]));} );
 
    for (size_t i = 0; i < N; i++) {
        cout << endl;
        for (size_t j = 0; j < N; j++)
            cout << Matrix[i][j] << " ";
    }
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.01.2020, 18:06
Ответы с готовыми решениями:

Определить функцию работы с векторами: Сложение векторов, разность, умножение на скаляр,скалярное произведение векторов,вычисление длины вектора
с помощью фукнций map/ map-into / reduce определить функцию работы с векторами: Сложение векторов, разность, умножение на скаляр,скалярное...

Сортировка вектора векторов по харатеристической сумме
задана квадратная матрица, нужно осортировать строки по сумме положительных четных элементов строки #include &quot;mainwindow.h&quot; ...

Сортировка через лямбда-функции
здраствуйте. помогите разобрать с лямбда-функциями. как реализовать данную сортировку через них? и вообще объясните плиз, как понять ГДЕ,...

18
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.01.2020, 18:19
Цитата Сообщение от L_Legioner Посмотреть сообщение
Написал вот такую штуку, но всё ровно не работает(( подскажите что не так???
C++
1
2
3
4
5
6
7
sort(Matrix.begin(), Matrix.end(), [] (const vector<int>& a, const vector<int>& b) 
{
    return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), [](int a, int b)
    {
        return abs(a) < abs(b);
    });
});
1
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
12.01.2020, 18:50
Цитата Сообщение от L_Legioner Посмотреть сообщение
Написал вот такую штуку, но всё ровно не работает(( подскажите что не так???
Всё у вас работает.
Просили отсортировать вектора по второму (первому, если считать с 0) элементу каждого вектора - получите.
0
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 104
12.01.2020, 20:01  [ТС]
oleg-m1973,
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
C++
1
std::lexicographical_compare
Что это значит?

Добавил вот это сортирует только первый столбец. А всю матрицу можно отсортировать?

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
C++
1
2
3
4
5
6
7
sort(Matrix.begin(), Matrix.end(), [] (const vector<int>& a, const vector<int>& b) 
{
    return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), [](int a, int b)
    {
        return abs(a) < abs(b);
    });
});
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
12.01.2020, 20:34
Лучший ответ Сообщение было отмечено L_Legioner как решение

Решение

Цитата Сообщение от L_Legioner Посмотреть сообщение
Добавил вот это сортирует только первый столбец. А всю матрицу можно отсортировать?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for (auto &v: Matrix)
    sort(v.begin(), v.end(), [](int i, int j) 
    { 
        return (abs(i) < abs(j)); 
    });
 
sort(Matrix.begin(), Matrix.end(), [] (const vector<int> &a, const vector<int> &b) 
{
    return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), [](int a, int b)
    {
        return abs(a) < abs(b);
    });
});
Добавлено через 52 секунды
Цитата Сообщение от L_Legioner Посмотреть сообщение
Что это значит?
std::lexicographical_compare
1
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 104
13.01.2020, 06:06  [ТС]
oleg-m1973, всё таки как-то странно сортирует. Почему так?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "pch.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
 
using namespace std;
 
const int N = 5;
 
int main()
{
    setlocale(0, "RUS");
    srand(time(NULL));
    vector<vector<int>> Matrix(N, vector<int>(N));
    for (size_t i = 0; i < N; i++) {
        cout << endl;
        for (size_t j = 0; j < N; j++) {
            cout << (Matrix[i][j] = rand() % 25) << "    ";
        }
    }
    cout << endl << endl << "Отсортированная матрица: " << endl;
 
    for (auto& v : Matrix) {
        sort(Matrix.begin(), Matrix.end(), [](const vector<int>& a, const vector<int>& b)
            {
                return lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), [](int a, int b)
                    {
                        return abs(a) < abs(b);
                    });
            });
    }
    for (size_t i = 0; i < N; i++) {
        cout << endl;
        for (size_t j = 0; j < N; j++)
            cout << Matrix[i][j] << "    ";
    }
    return 0;
}
Миниатюры
Сортировка вектора векторов по модулю через лямбда функцию  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.01.2020, 09:30
Цитата Сообщение от L_Legioner Посмотреть сообщение
oleg-m1973, всё таки как-то странно сортирует. Почему так?
Наверное потому, что я тебе совсем не так показывал
0
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 104
13.01.2020, 10:01  [ТС]
oleg-m1973, так показывали? Но так тоже не очень то сортирует
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "pch.h"
#include <iostream>
#include <algorithm>
#include <vector>
#include <ctime>
 
using namespace std;
 
const int N = 5;
 
int main()
{
    setlocale(0, "RUS");
    srand(time(NULL));
    vector<vector<int>> Matrix(N, vector<int>(N));
    for (size_t i = 0; i < N; i++) {
        cout << endl;
        for (size_t j = 0; j < N; j++) {
            cout << (Matrix[i][j] = rand() % 25) << "    ";
        }
    }
    cout << endl << endl << "Отсортированная матрица: " << endl;
 
    for (auto& v : Matrix)
        sort(v.begin(), v.end(), [](int i, int j)
            {
                return (abs(i) < abs(j));
            });
 
    sort(Matrix.begin(), Matrix.end(), [](const vector<int>& a, const vector<int>& b)
        {
            return std::lexicographical_compare(a.begin(), a.end(), b.begin(), b.end(), [](int a, int b)
                {
                    return abs(a) < abs(b);
                });
        });
 
    for (size_t i = 0; i < N; i++) {
        cout << endl;
        for (size_t j = 0; j < N; j++)
            cout << Matrix[i][j] << "    ";
    }
    return 0;
}
Миниатюры
Сортировка вектора векторов по модулю через лямбда функцию  
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.01.2020, 10:10
Цитата Сообщение от L_Legioner Посмотреть сообщение
oleg-m1973, так показывали? Но так тоже не очень то сортирует
Вроде правильно.
А как должно быть? Матрицу можно отсортировать по-разному
0
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 104
13.01.2020, 10:24  [ТС]
oleg-m1973, ааа тут по строкам сортирует. Понял. Мне прост надо. Хоть как) Спасибо

Добавлено через 2 минуты
oleg-m1973, а что нужно изменить, чтобы по столбцам сортировало???
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.01.2020, 10:26
Цитата Сообщение от L_Legioner Посмотреть сообщение
а что нужно изменить, чтобы по столбцам сортировало???
траспонировать - отсортировать по строкам - транспонировать
1
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.01.2020, 10:39
Цитата Сообщение от zayats80888 Посмотреть сообщение
траспонировать - отсортировать по строкам - транспонировать
Ну да. С std::sort по-другому просто так не получится
1
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
13.01.2020, 10:40
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
С std::sort по-другому просто так не получится
В теории можно свой итератор по столбцам написать
1
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 104
13.01.2020, 16:16  [ТС]
oleg-m1973, понял. Спасибо.

Добавлено через 12 секунд
zayats80888, понял)

Добавлено через 3 часа 55 минут
oleg-m1973 А можете по подробнее объяснить про вот это. Не совсем понимаю причём здесь лексикография. Как происходит сравнение? Просто почитал и написано что это команда используется для сравнения строк. Не совсем понял как она работает. Можете объяснить?
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
C++
1
std::lexicographical_compare
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.01.2020, 16:21
Цитата Сообщение от L_Legioner Посмотреть сообщение
oleg-m1973 А можете по подробнее объяснить про вот это. Не совсем понимаю причём здесь лексикография. Как происходит сравнение? Просто почитал и написано что это команда используется для сравнения строк. Не совсем понял как она работает. Можете объяснить?
Это функцию использует вектор в операторах сравнения - https://en.cppreference.com/w/... erator_cmp

Compares the contents of two containers.

1-2) Checks if the contents of lhs and rhs are equal, that is, they have the same number of elements and each element in lhs compares equal with the element in rhs at the same position.
3-6) Compares the contents of lhs and rhs lexicographically. The comparison is performed by a function equivalent to std::lexicographical_compare.
Ты не можешь использовать эти операторы, т.к. тебе нужно сравнивать по модулю, поэтому используем lexicographical_compare с соответствующим предикатом
1
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 104
13.01.2020, 16:24  [ТС]
oleg-m1973, просто не совсем понятно как std::lexicographical_compare работает именно в моей программе, что сравнивает? Как?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.01.2020, 16:27
Цитата Сообщение от L_Legioner Посмотреть сообщение
oleg-m1973, просто не совсем понятно как std::lexicographical_compare работает именно в моей программе, что сравнивает? Как?
Сравнивает две строки в матрице, т.е. два вектора, при сортировке. Можешь заменить её на
C++
1
2
3
4
    sort(Matrix.begin(), Matrix.end(), [](const vector<int>& a, const vector<int>& b)
        {
            return a < b;
        });
Будет то же самое, но без модуля
1
0 / 0 / 0
Регистрация: 30.09.2019
Сообщений: 104
13.01.2020, 16:46  [ТС]
oleg-m1973, то есть std::lexicographical_compare нужна для модуля?
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
13.01.2020, 16:47
Цитата Сообщение от L_Legioner Посмотреть сообщение
oleg-m1973, то есть std::lexicographical_compare нужна для модуля?
Да, именно для него
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.01.2020, 16:47
Помогаю со студенческими работами здесь

Определить для заданных векторов длину каждого вектора и найти номер самого длинного вектора
Создайте структуру Вектор с элементами x, y, z – декартовые координаты. Определить для M заданных векторов длину каждого вектора и найти...

Сортировка вектора через std::sort
Доброго времени суток, интересует сабж void Sort(list&lt;int&gt; &amp;past) { sort(past.begin(), past.end()); } на такое выдает ...

Лямбда: заполнение вектора случайными числами
хотел заполнить вектор случайными числами с помощью лямбда, но че то ничего не получилось... #include &lt;iostream&gt; #include...

Изменение содержимого вектора из лямбда функции
Только начал разбираться с лямбда, не могу понять, что нетак сделал. Вот код, std::queue&lt;Pointf&gt; active; Pointf point =...

Найти все значения параметра лямбда, для которых указанная система векторов-строк будет линейно зависимой
Здравствуйте, помогиите, пожалуйста, с данной задачей: Найти все значения параметра лямбда, для которых указанная система векторов-строк...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru