Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 298

лямбда - предикат - бинарный

12.08.2020, 13:55. Показов 1940. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Бодрый день.

Имеем:
1. компилятор GCC;
2. задание: написать код для мультимножества типа инт, отсортировать его при помощи бинарного предиката, оформенного как лямбда-выражение.

Что делал:
1. Написал код(см. ниже), компилятор ругается, не могу понять где ошибся.
Комментарии по коду после кода.
C++ (Qt)
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
// z-22-1(2).cpp
 
# include <iostream>
# include <set>
# include <algorithm>
 
using namespace std;
 
// Display.
template <typename T>
void Display (const T & inputMultiset) {
    for (auto iIterator = inputMultiset.cbegin(); \
                    iIterator != inputMultiset.cend(); \
                    ++iIterator) {
        cout << *iIterator << endl;
    }
}
 
int main () {
    multiset<int> intMset;
    intMset.insert (3);
    intMset.insert (1);
    intMset.insert (2);
    Display(intMset);
    sort(intMset.cbegin(), intMset.cend(), \
            [](const auto & num1, const auto & num2) ->bool {
                return (num1 > num2);
            }
    );
    Display(intMset);
 
 
    return 0;
}
Комментарии к коду выше:
1. создал объект мМножества типа инт;
2. вставил числа;
3. вывел мультимножество на экран до сортировки;
4. сортирую:
4.1. sort( от начала, до конца, предикат(см. ниже) );
4.1.1. [без "захвата"] (принимаю по ссылке значение типа auto) возвращаю логическое значение {описываю принятие решения кто есть больше}
5. вывожу мМножество на экран.
6. компилятор ругается:
"d:\mingw\lib\gcc\mingw32\9.2.0\include\ c++\bits\stl_algo.h|1968|error: no match for 'operator-' (operand types are 'std::_Rb_tree_const_iterator<int>' and 'std::_Rb_tree_const_iterator<int>')|"

Вопрос:
В чем ошибка?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.08.2020, 13:55
Ответы с готовыми решениями:

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

Лямбда-выражения. Как описать лямбда-процедуру и передать в нее файловую переменную?
Погуглив не смогла найти ответов на свои вопросы. Есть следующая процедура, которая находит положительные числа в одном файле и...

Записать в бинарный файл массив объектов Student (бинарный файловый ввод/вывод)
Здравствуйте. Стоит задача записать в бинарный файл массив объектов student: class student { string firstname,lastname, group; ...

8
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13198 / 6833 / 1822
Регистрация: 18.10.2014
Сообщений: 17,293
12.08.2020, 14:18
Вы занимаетесь какой-то ерундой. multiset невозможно "отсортировать" - он и так всегда отсортирован
2
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 298
12.08.2020, 15:00  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Вы занимаетесь какой-то ерундой. multiset невозможно "отсортировать" - он и так всегда отсортирован
аааа, точно, стыдоба-то какая.... это я себе )

Добавлено через 1 минуту
переделал в вектор:
C++ (Qt)
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
// z-22-1(2).cpp
 
# include <iostream>
# include <vector>
# include <algorithm>
 
using namespace std;
 
// Display.
template <typename T>
void Display (const T & inputVector) {
    for (auto iIterator = inputVector.cbegin(); \
                    iIterator != inputVector.cend(); \
                    ++iIterator) {
        cout << *iIterator << endl;
    }
}
 
int main () {
    vector<int> intVector;
    intVector.push_back (3);
    intVector.push_back (1);
    intVector.push_back (2);
    Display(intVector);
    sort(intVector.cbegin(), intVector.cend(), \
            [](const auto & num1, const auto & num2) ->bool {
                return (num1 > num2);
            }
    );
    Display(intVector);
 
    return 0;
}
Ругань компилятора:
"d:\mingw\lib\gcc\mingw32\9.2.0\include\ c++\bits\stl_algo.h|1851|error: assignment of read-only location '__first.__gnu_cxx::__normal_iterator<co nst int*, std::vector<int> >::operator*()'|"

Добавлено через 2 минуты
я прям сокрушаюсь над собой, такой момент забыть про мМножество...
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13198 / 6833 / 1822
Регистрация: 18.10.2014
Сообщений: 17,293
12.08.2020, 15:03
Лучший ответ Сообщение было отмечено Palich как решение

Решение

Цитата Сообщение от Palich Посмотреть сообщение
Ругань компилятора:
"d:\mingw\lib\gcc\mingw32\9.2.0\include\ c++\bits\stl_algo.h|1851|error: assignment of read-only location '__first.__gnu_cxx::__normal_iterator<co nst int*, std::vector<int> >::operator*()'|"
Так а почему в сортировку передается cbegin() и cend()? Сортировка - это не константная операция.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
12.08.2020, 15:49
Цитата Сообщение от Palich Посмотреть сообщение
переделал в вектор
А multimap в задании просто так был указан?

Если все-таки не просто так, то наверное стоило бы сделать предикат для multimap, как просили в задании.
0
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 298
12.08.2020, 17:09  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Так а почему в сортировку передается cbegin() и cend()? Сортировка - это не константная операция.
потому что мной было неправильно уяснен константный итератор: я думал что константный итератор не дает изменять значение в элементе контейнера, а сам интератор меняться может для перебора элементов...
Знания подкорректировал, все заработало.
Спасибо!

Добавлено через 1 минуту
Цитата Сообщение от DrOffset Посмотреть сообщение
А multimap в задании просто так был указан?
Если все-таки не просто так, то наверное стоило бы сделать предикат для multimap, как просили в задании.
нет, в исходной задаче как раз про вектор говорилось, это я решил отсортировать отсортированное и написал сюда задание мной измененное.
0
653 / 466 / 183
Регистрация: 23.04.2019
Сообщений: 1,987
12.08.2020, 17:18
Цитата Сообщение от Palich Посмотреть сообщение
я думал что константный итератор не дает изменять значение в элементе контейнера
а сортировка как будет работать без изменения значений контейнера?

Добавлено через 45 секунд
Цитата Сообщение от Palich Посмотреть сообщение
а сам интератор меняться может для перебора элементов...
может
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<int> a = {1,2,3,4,5,6,7,8,1};
    auto it = a.cbegin();
    it++;
}
1
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 298
12.08.2020, 17:23  [ТС]
так ) я понял, у меня бардак в голове с этим итератором. Пойду-ка я перечитаю про итератор )
0
2 / 2 / 0
Регистрация: 07.04.2016
Сообщений: 298
13.08.2020, 10:41  [ТС]
Перечитал, подкорректировал свои "днищенские" познания в с++.
Да, сам итератор меняться может. Мне нужно помнить еще о правильности наследования "константности", если создаем итератор "const_iterator" то и метод ".begin" тоже будет константным. Ошибкой будет наобоот: "iterator" а метод ".cbegin" т.к. в наследовании сначала идет константный а затем простой итератор. Короче, так делать нельзя )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.08.2020, 10:41
Помогаю со студенческими работами здесь

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

Лямбда-исчисление
Здравствуйте! В следующем выражении мне нужно выделить свободные и связанные переменные в термах и выполнить подстановку: Правильно ли...

Лямбда функция
Приветствую. Может кто пояснить, что это означает (OnProcessCommand: string -&gt; string) и какие параметры надо передавать этой процедуре?...

Лямбда выражение
Здравствуйте форумчане. Ни как не могу понять что значит вот этот вот код? public string FullName =&gt; $&quot;{FirstName}...

лямбда выражение
setq x '(1 2 3 4) x ((lambda (x) (rplaca x '6)) x) x Как сделать тело (rplaca x '6) x) через lambda чтобы получилось типо...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru