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

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

12.01.2020, 18:06. Показов 6930. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru