Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337

Сортировка динамической матрицы по первой строке используя лямбда-выражение

23.11.2019, 18:11. Показов 1276. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые форумчане! Столкнулся со следующей проблемой. Не могу правильно скомпилировать этот код. Не получается использовать лямбда-выражение правильно. Помогите, пожалуйста, исправить ошибку. Нужна именно динамически объявленная матрица и именно stable_sort и компаратор.

Ошибка:

C++
1
stable_sort(a, a + n, [&](int &i, int &j) { return a[0][i] < a[0][j]; });
Код программы:

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
#include <iostream>
#include <algorithm>
 
    using namespace std;
 
int main() {
    int n;
    cin >> n;
    int** a = new int*[2];
    for (int i = 0; i < 2; i++) {
        a[i] = new int[n];
    }
    cout << "Enter a matrix:\n";
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < n; j++) {
            cin >> a[i][j];
        }
    }
    stable_sort(a, a + n, [&](int &i, int &j) { //Здесь выдает ошибку
        return a[0][i] < a[0][j];
    });
    cout << "Output of the program:\n";
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < n; j++) {
            cout << a[i][j] << " ";
        }
        cout << "\n";
    }
    for (int i = 0; i < 2; i++) {
        delete[] a[i];
    }
    delete[] a;
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.11.2019, 18:11
Ответы с готовыми решениями:

Вычислить сумму ряда используя лямбда-выражение
Здравствуйте! Помогите, пожалуйста, вычисилить вот такую сумму ряда: y = \sum_{i=1}^{m}\sum_{j=1}^{n} ({i}^{j}-i) Нужно каким-то...

Сортировка динамической матрицы
Написать программу сортировки динамического двумерного массива. Общее задание: Динамический двумерный массив (массив строк или...

Найти максимум в первой строке матрице и в последней строке матрицы
Ввести двумерный массив A (NxM) , вывести его. Найти максимум в первой строке матрице и в последней строке матрицы. На большее из этих...

17
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
23.11.2019, 18:17  [ТС]
Вот скриншот ошибки, который я забыл приложить:
Миниатюры
Сортировка динамической матрицы по первой строке используя лямбда-выражение  
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
23.11.2019, 18:37
Вы создали массив кусками, он не последовательно расположен в памяти.
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
#include <iostream>
#include <algorithm>
 
int main()
{
    std::cout << "Set Rows and Cols:\n";
    size_t rows, cols;
    std::cin >> rows >> cols;
    int* arr = new int[rows * cols];
 
    std::cout << "Enter a matrix:\n";
    for (size_t i(0); i < rows; ++i)
        for (size_t j(0); j < cols; ++j)
            std::cin >> arr[i * cols + j];
 
    std::stable_sort(arr, arr + rows * cols, [&](int i, int j) {
        return i < j;
    });
 
    std::cout << "Output of the program:\n";
    for (size_t i(0); i < rows; ++i) {
        for (size_t j(0); j < cols; ++j) {
            std::cout << arr[i * cols + j] << ' ';
        }
        std::cout << '\n';
    }
 
    delete[] arr;
    return 0;
}
1
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
24.11.2019, 14:06  [ТС]
nalbe666, здравствуйте! Спасибо, что уделили внимание. Я хотел спросить, выходит, что в том виде, в котором я пытаюсь это сделать это сделать просто невозможно и вы мне предлагайте свой вариант? Я перепишу код, если это так. Жду вашего ответа.
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
24.11.2019, 15:52
Функция сортировки просит итераторы на начало и конец последовательности. Если создавать массив частями, они не лягут в памяти последовательно, так как сначала объявляется массив указателей, а потом под каждый указатель где-то выделится по блоку памяти.
Другое дело, для статичного массива, или одномерного.
example

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
int main()
{
    const int rows(3), cols(4);
 
    int arr1[rows][cols]{ {1,2,3,4},{4,3,2,1},{1,3,2,4} };
    int** arr2 = new int* [rows];
    for (size_t i = 0; i < rows; ++i) {
        arr2[i] = new int[cols];
        for (size_t j = 0; j < cols; ++j) arr2[i][j] = rand() % 5;
    }
 
    std::stable_sort(arr1[0], arr1[0] + rows * cols, [](int i, int j) { return i < j; });
    std::stable_sort(arr2[0], arr2[0] + rows * cols, [](int i, int j) { return i < j; });
 
    for (size_t i = 0; i < rows; ++i) {
        for (size_t j = 0; j < cols; ++j) {
            std::cout << arr1[i][j] << ' ';
        }
        std::cout << "\n";
    }
    std::cout << "\n";
 
    for (size_t i = 0; i < rows; ++i) {
        for (size_t j = 0; j < cols; ++j) {
            std::cout << arr2[i][j] << ' ';
        }
        std::cout << '\n';
    }
 
    return 0;
}
/*
1 1 1 2
2 2 3 3
3 4 4 4
 
-1946156942 -33686019 0 0
4 4 3 3
2 4 0 0
*/
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,982
24.11.2019, 16:39
Fixer_84, по логике, вот так должно заработать

C++
1
2
3
    stable_sort(a, a + n, [](int* i, int* j) { 
        return i[0] < j[0];
    });
Добавлено через 1 минуту
только i и j обязательно должны быть валидными, лямбда это не проверяет

Добавлено через 16 минут
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
45
46
47
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int main()
{
    int n=5;
 
    std::vector<std::vector<int>> a(n,std::vector<int>(n,0));
 
    for (int y = 0; y < a.size(); y++)
    {
        for (int x = 0; x < a[y].size(); x++)
        {
            a[y][x]=rand()%100;
        }
    }
 
    //вывод до сортировки
    for (int y = 0; y < a.size(); y++)
    {
        for (int x = 0; x < a[y].size(); x++)
        {
            cout << a[y][x] << "   ";
        }
        cout << "\n";
    }
 
    std::stable_sort(a.begin(), a.end(), [](auto& yl, auto& yr)
    {
        return yl[0] < yr[0];
    });
 
    //вывод после сортировки
    cout << "\n";
    for (int y = 0; y < a.size(); y++)
    {
        for (int x = 0; x < a[y].size(); x++)
        {
            cout << a[y][x] << "   ";
        }
        cout << "\n";
    }
 
    return 0;
}
C++
1
2
3
4
5
6
7
8
9
10
11
41   67   34    0   69
24   78   58   62   64
 5   45   81   27   61
91   95   42   27   36
91    4    2   53   92
 
 5   45   81   27   61
24   78   58   62   64
41   67   34    0   69
91   95   42   27   36
91    4    2   53   92
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
24.11.2019, 19:37  [ТС]
Алексей1153, здравствуйте! Спасибо за ваш ответ. Дело в том, что мне нужно отсортировать элементы строк, а не сами строки. То есть, (см. код в посте #1) мне нужно сортировать элементы второй строки матрицы вместе с элементами первой строки.
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,982
24.11.2019, 20:31
Fixer_84, меняем x и y местами - задача решена

Добавлено через 3 минуты
или я неправильно задачу понимаю?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
24.11.2019, 20:32
Цитата Сообщение от Fixer_84 Посмотреть сообщение
(int &i, int &j)
вот эта часть кода мне не нравиться
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,982
24.11.2019, 20:34
Fixer_84, допустим, имеется такая матрица

1 7 3 3
5 7 6 4
9 4 6 2
5 1 5 4


требуется отсортировать вторую строку, результат

1 7 3 3
4 5 6 7 <--
9 4 6 2
5 1 5 4


так?

тогда с моим контейнером это будет выглядеть так

C++
1
2
3
int n=5;
std::vector<std::vector<int>> a(n,std::vector<int>(n,0));
std::stable_sort(a[1].begin(), a[1].end());
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
24.11.2019, 20:47
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Дело в том, что мне нужно отсортировать элементы строк, а не сами строки.
тогда правка для исходного кода
C++
1
2
3
4
    int k{ 1 };// индекс строки
    stable_sort(a[k], a[k] + n, [](int i, int j) {
        return i < j;
    });
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
24.11.2019, 21:18  [ТС]
У меня есть матрица, состоящая из 2 строк. Мне нужно отсортировать обе строки по следующему правилу. Нужно вместе с элементами первой строки, отсортировать элементы второй строки (так я хотел сделать в посте #1).

Например, для n = 5:

Было:

3 2 4 5 1
1 2 3 4 5

Стало:

1 2 3 4 5
5 2 1 3 4

Нужно сделать с помощью лямбда-выражения то, что делает этот код:

C++
1
2
3
4
5
6
7
8
for (int i = 0; i < n; i++) {
    for (int j = n - 1; j > i; j--) {
        if (a[0][j] < a[0][j-1]) {
            swap(a[0][j], a[0][j-1]);
            swap(a[1][j], a[1][j-1]);
        }
    }
}
P.S. Я использую stable_sort(), чтобы ускорить сортировку.
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,982
24.11.2019, 21:22
Fixer_84, кажись, я понял, что нужно:

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int main()
{
    size_t x_max=5;//столбцы
    size_t y_max=3;//строки
 
    using T=int;
    std::vector<std::vector<T>> matrix(y_max,std::vector<T>(x_max,T(0)));
 
    //заполняем рандомно
    for(auto& line:matrix)
    {
        for(auto& val:line)
        {
            val=rand()%10;
        }
    }
 
    //вывод до сортировки
    for(const auto& line:matrix)
    {
        for(auto& val:line)
        {
            cout << val << "  ";
        }
        cout << "\n";
    }
 
    //хотим сортировать по строке с индексом 1
    const size_t sort_line_index=1;
 
    if(sort_line_index<y_max)
    {
        //связь индекс-значение
        struct s_index_keeper
        {
            size_t index=0;
            T value=0;
        };
 
        //массив, который запомнит после сортировки, где были индексы
        std::vector<s_index_keeper> order;
 
        //заполняем order
        order.resize(x_max);
        for(size_t x = 0; x < order.size(); x++)
        {
            order[x].index=x;
            order[x].value=matrix[sort_line_index][x];
        }
 
        //сортируем order
        std::stable_sort(order.begin(), order.end(), [](auto& l, auto& r)
        {
            return l.value < r.value;
        });
 
        //теперь каждую строку матрицы нужно расставить
        //в соответствии с порядком индексов в order
        for(auto& line:matrix)
        {
            //делаем копию строки
            const auto line_copy=line;
 
            //расставляем значения в текущей строке из копии
            for (size_t x = 0; x < order.size(); x++)
            {
                line[x]=line_copy[order[x].index];
            }
        }
 
        //вывод после сортировки
        cout << "\n";
        for(const auto& line:matrix)
        {
            for(auto& val:line)
            {
                cout << val << "  ";
            }
            cout << "\n";
        }
    }
 
    system("pause");
    return 0;
}
1 7 4 0 9
4 8 8 2 4 <-- будем сортировать
5 5 1 7 1

0 1 9 7 4
2 4 4 8 8 <-- результат
7 5 1 5 1


Добавлено через 2 минуты
Fixer_84, ну, либо вариант из моего поста #6 , только поменять местами x и y в контейнере
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
24.11.2019, 21:27
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Мне нужно отсортировать обе строки по следующему правилу
Тогда сначала транспонируй, потом отсортируй так:
C++
1
2
3
stable_sort(a, a + n, [](int* i, int* j) {
        return *i < *j;
    });
потом обратно транспонируй
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,982
24.11.2019, 21:30
Fixer_84,

как часто требуется такая сортировка ?
Всегда переставляются столбцы? Или иногда строки тоже?
0
 Аватар для Fixer_84
1505 / 969 / 812
Регистрация: 30.04.2016
Сообщений: 3,337
24.11.2019, 21:43  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
как часто требуется такая сортировка?
Всегда переставляются столбцы? Или иногда строки тоже?
Мне нужно сделать такую сортировку, чтобы решить задачу. Нужен stable_sort для ускорения работы программы.

Алексей1153, спасибо за ваш комментарий. Мне нужно отсортировать элементы матрицы так, как я показал в посте #12. То есть, есть матрица, состоящая из двух строк и нужно отсортировать элементы второй строки вместе с элементами первой.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
24.11.2019, 21:49
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Нужен stable_sort для ускорения работы программы.
тогда что бы не тратить время на транспонирование, задайте матрицу изначально транспонированной (массив указателей на столбцы), просто ввод/вывод непривычный будет (это дополнение к посту №14)
0
фрилансер
 Аватар для Алексей1153
6442 / 5636 / 1127
Регистрация: 11.10.2019
Сообщений: 14,982
24.11.2019, 21:58
Цитата Сообщение от Fixer_84 Посмотреть сообщение
нужно отсортировать элементы второй строки вместе с элементами первой
то есть, при сортировке переставляются столбцы. Значит, первый индекс массива должен быть столбцами, а второй - строками, тогда из поста #6 вот такая лямбда решает задачу

C++
1
2
3
4
    std::stable_sort(a.begin(), a.end(), [](auto& yl, auto& yr)
    {
        return yl[0] < yr[0];
    });
Добавлено через 1 минуту
Fixer_84, ну а если код из поста #12 УЖЕ решает задачу, то так и оставь. Лямбда ничего не ускорит

Добавлено через 2 минуты
Fixer_84, чтобы ускорить перестановку столбцов, нужно в первом индексе иметь УКАЗАТЕЛИ на столбцы. Первый проход определяет новый порядок (после сортировки), вторым проходом обмениваем указатели в нужном порядке
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.11.2019, 21:58
Помогаю со студенческими работами здесь

Поменять местами наибольший элемент в первой строке матрицы с наименьшим элементом в третьей строке
В двумерном массив заменить местами наибольший элемент в первой строчке с наименьшим элементом в третьем

Если минимальный элемент матрицы стоит в первой строке, то элементы, стоящие в строке за ним, заменить нулями
Задана матрица С(5,5). Если минимальный элемент стоит в первой строке, то все элементы стоящие в строке за ним, заменить нулями. Какие...

Сортировка по первой букве в строке.
Здравствуйте. Есть запись в базе mediumtext, сама запись - это контент странички, что-то типа глоссария (список определений). Как лучше...

Сортировка слов в строке по первой букве
Добрый день. У меня такой вопрос: как можно отсортировать слова (могут содержать как буквы так и цифры) в строке таким образом, что если...

Если в первой строке матрицы все элементы меньше заданной велечины, исключить ее из матрицы
если в первой строке заданной матрицы все элементы меньше заданной велечины Е , исключить ее из матрицы , иначе подсчитать число...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru