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

Лямбда выражения

10.11.2011, 14:33. Показов 7174. Ответов 31
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здрасьте)
вопрос по новому стандарту, в который ввели лямбда-выражения.
создаю класс, у которого есть поле data, типа map.
C++
1
map <string, list<string> > data;
заполняю его. и теперь мне нужно отсортировать списки, которые в нём находятся.
первый логичный вариант -
C++
1
2
for(map <string, list<string> > :: iterator p = data.begin(); p != data.end(); ++p)
                    p->second.sort();
(кстати, в этом случае - всё прекрасно работает)
но задание у меня такого, что нельзя использовать циклы, тогда пробую так:
C++
1
2
3
4
for_each(data.begin(), data.end(), [](pair<string, list<string> > p)
                 {
                     p.second.sort();
                 });
но при вызове
C++
1
2
3
4
5
6
7
8
9
10
11
map<string, list<string> > :: iterator p = data.begin();
for_each(&mas[0], &mas[size],[&p, &result](int x)
        {
            if (x == 1)
            {
                list<string> help;
                set_intersection(result.begin(), result.end(), p->second.begin(), p->second.end(), back_inserter(help));                
                result.assign(help.begin(), help.end());
                ++p;
            }
}
обнаруживается, что списки в мэпе не отсортированы!
возвращиюсь к сорту (с помощью лямбды) вывожу значения всего мепа (по спискам) и дейстительно! лямбда-выражение его не отсортировало.
Появилась идея, что нужно включить data в список захвата, но строчка
C++
1
2
3
4
for_each(data.begin(), data.end(), [&data](pair<string, list<string> > p)
                 {
                     p.second.sort();
                 });
не компилируется, ибо data - член класса, который "не является переменной".

Если нужен полный код - вот он.
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
// Var 9.cpp: определяет точку входа для консольного приложения.
//Имеется список 40 студентов, изучающих математику, физику, биологию и химию, заданный в файле в виде строк 
//Фамилия    предмет
 
//Каждый предмет изучает около 20 студентов. Разработать структуры данных, позволяющих эффективно отвечать на запросы вида 
//«Выдать всех студентов, изучающих биологию и химию, но не изучающих физику».
 
#include "stdafx.h"
#include <algorithm>
#include <iostream>
#include <string>
#include <fstream>
#include <list>
#include <map>
#include <iterator>
using namespace std;
 
/*
биологию   mas[0]
математику mas[1]
физику       mas[2]
химию      mas[3]
*/
 
class stud_file
{
map <string, list<string> > data;
list<string> all_stud;
 
public:
    
    stud_file (string s) 
    {
        ifstream FS; //Fs(s) ?
        FS.open(s);
                 string Fam, pred;
                 while(!FS.eof()) //а как читать?
                 {
                    FS >> Fam;
                    FS >> pred;
                    data[pred].push_back(Fam);
 
                    list<string> :: iterator pb = all_stud.begin();
                    list<string> :: iterator pe = all_stud.end();
                    if (find(pb, pe, Fam) == pe)
                    {
                        all_stud.push_back(Fam);
                    }
 
                 }
                 FS.close();
 
                 all_stud.sort(); //надо сортировать
                 
                 for_each(data.begin(), data.end(), [&data](pair<string, list<string> > p)
                 {
                     p.second.sort();
                 });
 
 
 
                 for(auto it = data.begin(); it!= data.end(); ++it)
                 {
                     for(auto itl = it->second.begin(); itl != it->second.end(); ++itl)
                     {
                         cout<<' '<<*itl<<' ';
                     }
                     cout<<"987"<<'\n';
                 }
            
 
 
 
                /* for(map <string, list<string> > :: iterator p = data.begin(); p != data.end(); ++p)
                    p->second.sort();*/
     }
 
    void print (int mas[], int size) //ваще беда))
    {
        list<string> result;
        result.assign(all_stud.begin(), all_stud.end());
        map<string, list<string> > :: iterator p = data.begin();
 
        for_each(&mas[0], &mas[size],[&p, &result](int x)
        {
            if (x == 1)
            {
                list<string> help;
                set_intersection(result.begin(), result.end(), p->second.begin(), p->second.end(), back_inserter(help));                
                result.assign(help.begin(), help.end());
                ++p;
            }
            else
                if (x == -1)
                {
                    string help[40];
                    auto it = set_difference(result.begin(), result.end(), p->second.begin(), p->second.end(), help);
                    result.assign(help, it);
                    ++p;
                }
                else
                    ++p;
        });
        /*for(int i = 0; i<size; ++i)
        {
            if (mas[i] == 1)
            {
                string help[40];
                auto it = set_intersection(result.begin(), result.end(), p->second.begin(), p->second.end(), help);
                result.assign(help, it);
                ++p;
            }
            else
                if (mas[i] == -1)
                {
                    string help[40];
                    auto it = set_difference(result.begin(), result.end(), p->second.begin(), p->second.end(), help);
                    result.assign(help, it);
                    ++p;
                }
        }*/
        for(list<string> :: iterator l = result.begin(); l != result.end(); ++l)
            cout<< *l<<'\n';
        cout<<"\n";
    }
};
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(0, "Rus");
    const int n = 4;
    int mas[n] = {0,0,0,0};
 
    stud_file Stud("file.txt");
 
    cout<<"†††††††††††††††††††††††††††††††††††††††††††††\n";
    cout<<"Установите нужные параметры поиска\n";
    int con = 0;
    while (con !=-1)
    {
        cout<<"†††††††††††††††††††††††††††††††††††††††††††††\n";
        cout<<"биология       => 0\n";
        cout<<"математика     => 1\n";
        cout<<"физика         => 2\n";
        cout<<"химия          => 3\n";
        cout<<"текущий выбор  => 101\n";
        cout<<"вывести список => 102\n";
        cout<<"Выйти          => -1\n";
        cin >> con;
 
        switch (con)
        {
        case 0:
        case 1:
        case 2:
        case 3:
            {
                cout<<"изучает   =>1\n";
                cout<<"неважно   =>0\n";
                cout<<"неизучает =>-1\n";
                int i;
                cin>>i;
                mas[con] = i;
                break;
            }
        case 101:
            {
                for_each(&mas[0], &mas[n], [](int x){cout<<x<<' ';});
                cout<<"\n";
                break;
            }
        case 102:
            {
                Stud.print(mas,n);
            }
        }
    }
    return 0;
}
хочу разобраться именно с лямбда выражениями. Напомню - циклы использовать нельзя, а объект-функции просто не хочется
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.11.2011, 14:33
Ответы с готовыми решениями:

Лямбда-выражения
Можно ли создать лямбда-функцию с неизвестным, переменным числом аргументов неизвестного типа? например чтобы посчитать сумму?

Лямбда-выражения
#include &lt;algorithm&gt; #include &lt;iostream&gt; #include &lt;vector&gt; using namespace std; class FunctorClass { public: explicit...

Лямбда-выражения и замыкание
Здравствуйте, изучаю новый для себя стандарт языка и не совсем могу разобраться с замыканием Прогнал по отладчику - c изменяется...

31
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.11.2011, 14:35
Цитата Сообщение от IcyWind Посмотреть сообщение
[](pair<string, list<string> > p)
Передается по значению, т.е. создается новый объект.
Передавайте по ссылке
C++
1
pair<string, list<string> > &p
Еще лучше нормальный foreach использовать
C++
1
2
for ( auto &p : data )
  p.second.sort();
1
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
10.11.2011, 14:44
А если так?

C++
1
2
3
4
[](pair<string, list<string> > &p)
                                 {
                                         p.second.sort();
                                 }
Добавлено через 22 секунды

Не по теме:

пока читал, опоздал :-)



Добавлено через 2 минуты

Не по теме:

diagon, эх жаль, что мой gcc не понимает этот новый for. Красиво.

0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.11.2011, 14:47
Цитата Сообщение от talis Посмотреть сообщение
diagon, эх жаль, что мой gcc не понимает этот новый for. Красиво.
А мой понимает
Bash
1
2
3
4
5
6
diagon@shadeware:~$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1
Copyright (C) 2011 Free Software Foundation, Inc.
Это свободно распространяемое программное обеспечение. Условия копирования
приведены в исходных текстах. Без гарантии каких-либо качеств, включая 
коммерческую ценность и применимость для каких-либо целей.
Только я компилирую с ключом -std=c++0x. Без него не работает.
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
10.11.2011, 14:49
diagon, я тоже с ключом. Просто я в основном под mingw сейчас сижу, давно не обновлял
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
10.11.2011, 14:53  [ТС]
Цитата Сообщение от diagon Посмотреть сообщение
Передается по значению, т.е. создается новый объект, копирующий старый.
Передавайте по ссылке
C++
1
pair<string, list<string> > &p
нет, это строчка - аналог operator ()
for_each делает (*p)
список передаваемых параметров заключён в [], но я не передаю параметр
компилятор создаёт какую-то функцию, с каким-то именем, а то, что написано в () в моей записи - это аналог operator() для созданной компилятором объект-функции
и тогда запись
C++
1
pair<string, list<string> > &p
приведёт к ошибке компиляции - не соответствие типов
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.11.2011, 14:56
Цитата Сообщение от IcyWind Посмотреть сообщение
нет, это эта строчка - аналог operator ()
Эта строчка - список аргументов.
Сравните сами
По значению - http://liveworkspace.org/code/... eb121eaf0d
По ссылке - http://liveworkspace.org/code/... 712fa79e1a
(Вывод внизу)
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.11.2011, 14:58
IcyWind, Нет. Передавать параметр надо по ссылке. Конструкция [] (type param) ничто иное как передача параметров. Передавайте по ссылке и все будет ок.
0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
10.11.2011, 14:58  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
IcyWind, Нет. Передавать параметр надо по ссылке. Конструкция [] (type param) ничто иное как передача параметров. Передавайте по ссылке и все будет ок.
C++
1
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(22): error C2664: void `anonymous-namespace'::<lambda0>::operator ()(std::pair<_Ty1,_Ty2> &) const: невозможно преобразовать параметр 1 из "std::pair<_Ty1,_Ty2>" в "std::pair<_Ty1,_Ty2> &"
ну и?
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
10.11.2011, 15:02
IcyWind, в gcc всё ок. vs 10 тупит. а вообще выложите строчки, выдающие ошибку.
0
10.11.2011, 15:03

Не по теме:

Цитата Сообщение от IcyWind Посмотреть сообщение
C++
1
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(22): error C2664: void `anonymous-namespace'::<lambda0>::operator ()(std::pair<_Ty1,_Ty2> &) const: невозможно преобразовать параметр 1 из "std::pair<_Ty1,_Ty2>" в "std::pair<_Ty1,_Ty2> &"
ну и?
Студия такая студия...

0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
10.11.2011, 15:04  [ТС]
ошибка тут
C++
1
2
3
4
5
6
7
8
template<class _InIt,
    class _Fn1> inline
    _Fn1 _For_each(_InIt _First, _InIt _Last, _Fn1 _Func)
    {   // perform function for each element
    for (; _First != _Last; ++_First)
        _Func(*_First);
    return (_Func);
    }
описание
C++
1
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm(22): error C2664: void `anonymous-namespace'::<lambda0>::operator ()(std::pair<_Ty1,_Ty2> &) const: невозможно преобразовать параметр 1 из "std::pair<_Ty1,_Ty2>" в "std::pair<_Ty1,_Ty2> &"
0
10.11.2011, 15:04

Не по теме:

Цитата Сообщение от talis Посмотреть сообщение
мой gcc не понимает этот новый for
В чём проблема обновить? ;)

0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.11.2011, 15:05
IcyWind, Как ни странно for_each не предназначен для изменения контейнера. По лямбде можно. Если не получается - используйте алгоритмы который для этого предназначены. std::transform к примеру.
1
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
10.11.2011, 15:06
IcyWind, да не вырезку из стандартной библиотеки. Строчку, которая породила ошибку.

Не по теме:

silent_1991, нужна была причина. Теперь есть причина :)

0
9 / 9 / 9
Регистрация: 19.09.2011
Сообщений: 272
10.11.2011, 15:08  [ТС]
C++
1
 for_each(data.begin(), data.end(), [](pair<string, list<string> > &p)
Добавлено через 1 минуту
Цитата Сообщение от ForEveR Посмотреть сообщение
IcyWind, Как ни странно for_each не предназначен для изменения контейнера. По лямбде можно. Если не получается - используйте алгоритмы который для этого предназначены. std::transform к примеру.
а да...наверно в этом всё дело
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.11.2011, 15:09
Как предложили выше можно через transform.
C++
1
2
3
4
5
transform( data.begin(), data.end(), data.begin(), [] ( pair< string, list< string > > p)
{
   p.second.sort();
   return p;
} );
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.11.2011, 15:11
IcyWind,
C++
1
std::transform(data.begin(), data.end(), data.begin(), [](std::pair<std::string, std::list<std::string>> elem) -> std::pair<std::string, std::list<std::string>> {elem.second.sort(); return elem;});
Добавлено через 39 секунд
diagon, Так не сработает насколько я помню.
1
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
10.11.2011, 15:12
Цитата Сообщение от ForEveR Посмотреть сообщение
diagon, Так не сработает насколько я помню.
Хм... Почему? Из-за отсутствия -> ?
На gcc нормально компилируется.
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.11.2011, 15:14
diagon, Значит я не прав.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.11.2011, 15:14
Помогаю со студенческими работами здесь

Функции и Лямбда выражения
Доброго времени суток, дорогие форумчане! Всплыл вопрос: &quot;Вот хочу сделать функцию и передавать ей как аргумент какое-то условие допустим...

Поток и результат из лямбда-выражения
Для метода градиентного спуска делаю программу. Все сводится к вычислению числителя и знаменателя, которое я решил распараллелить ...

Передача лямбда выражения в функцию
Не могу передать лямбда выражение (строка 131) в функцию (строка 94). В отладчике лямбда выражение (predicate) имеет тип &lt;lambda(const...

Почему не работают лямбда-выражения?
Почему не компилиться выводит 38 7 C:\Users\Administrator\Desktop\pjc6\z1-2\main.cpp 'lamMul' does not name a type ...

Что такое лямбда выражения?
Объясните, пожалуйста, простым и человеческим языком, что такое лямбда выражения? Можно на примере печати двумерного вектора (часть...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США. Нашел на реддите интересную статью под названием «Кто-нибудь знает, где получить бесплатный компьютер или. . .
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
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru