Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774

Можно ли и целесообразно ли использовать лямбду для присвоения значений полям массива объектов?

21.12.2015, 11:30. Показов 1407. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Хочу использовать лямбду для присвоения значений полям массива объектов(такое что то написал )
Обычным циклом все гладко, а вот с лямбдой крэшит (
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    int size = 0;
    cin >> size;
    Children*ch=new Children[size]();
    
    
    [ch]()mutable
    {   
        int x = 0, y = 0;
        char word[20];
        for (int i(0); i < 3; ++i)
        {
            cin.get();
            cin.getline(word, 20);
            cin >> x;
            cin >> y;           
            ch[i].Set(word, x, y);
        }
    
    };
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
21.12.2015, 11:30
Ответы с готовыми решениями:

Для чего ещё может быть нужен конструктор класса кроме присвоения полям класса начальных значений?
Для чего ещё может быть нужен конструктор класса кроме присвоения полям класса начальных значений?

Можно ли сокращать команды присвоения одинаковых значений для сжатия кода программы?
Всем доброго времени суток. Я недавно в c#, да и вообще в программировании. Вопрос первый: Можно ли как-то сокращать команды...

использование FindComponent в циклах для считывания/присвоения параметров существующих объектов
Прошу помочь разобраться как использовать FindComponent для обработки свойств существующих объектов в С++ Buider 2010 Задача: вывести...

28
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.12.2015, 11:32
минимальный рабочий пример проблемы тяжело скинуть настолько?)
0
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
21.12.2015, 11:36  [ТС]
C++
1
[&ch]()mutable
дело не поменяло (

Добавлено через 2 минуты
rikimaru2013,
Здравствуйте!!!
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
#include"Children.h"
int main()
{   
    int size = 0;
    cin >> size;
    Children*ch=new Children[size]();
    
    
    [&ch]()mutable
    {   
        int x = 0, y = 0;
        char* word= new char[20]();
        for (int i(0); i < 3; ++i)
        {
            cin.get();
            cin.getline(word, 20);
            cin >> x;
            cin >> y;           
            ch[i].Set(word, x, y);
        }
        delete[] word;
    
    };
 
    
    
    
/*  void foo(Children ch[], char*word, int x, int y);
    foo(ch, word, x, y);*/
    
 
    return 0;
}
/*void foo(Children ch[], char*word, int x, int y)
{
    for (int i(0); i < 3; ++i)
    {
        
        cin.getline(word, 20);      
        cin >> x;
        cin >> y;
        cin.get();
        
    
        ch[i].Set(word, x, y);
    }
 
}*/
Если закоментить лямбду и открыть цикл все тип-топ
вот сам класс
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
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
class Children
{
public:
    Children(char*text=nullptr, int x = 0, int y = 0) :good_m(x), bad_m(y) 
    {
        if (text)
        {
            name = new char[strlen(text) + 1]();
            strcpy(name,text);
        }
        else
        {
            name = nullptr;
        }
 
         cout << "\nChildren created by default\n"; 
    }
    Children(Children&ob)
    {
        name = new char[strlen(ob.name)+1]();
        strcpy(name, ob.name);
        good_m = ob.good_m;
        bad_m = ob.bad_m;
        cout << "\nCreated by copie\n";
 
    }
    void Set(char*text,int x, int y)
    {
        if (name)
            delete[]name;
        name = new char[strlen(text) + 1]();
        strcpy(name, text);
        good_m=x, bad_m=y; 
    }   
    void Print()const { cout << "\n" << name << " " << good_m << " " << bad_m << "\n"; }
    ~Children()
    { 
        if (name)delete name;
        name = nullptr;
    cout << "\nChildren deleted\n"; 
    }
private:
    char*name;
    int good_m;
    int bad_m;
};
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
21.12.2015, 11:37
Ну сделал лямбду, а "запускать" её кто будет?
C++
1
2
3
4
5
6
7
8
9
10
    [ch]()
    {   
        int x = 0, y = 0;
        char word[20];
        for (int i(0); i < 3; ++i)
        {
            std::cout << "x" << std::endl ;
        }
    
    }();//Хехей, пустись!!!
1
 Аватар для anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
21.12.2015, 11:39  [ТС]
Croessmah,
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.12.2015, 17:04
Croessmah, мне кажится или запись ТСа не требует лямбды, а если бы и требовала - то одиночный вызов не предпологает создание лябды - то есть вызов лямбы в такой форме - уже как-то неправильно.

Поднимаю вопрос с точки зрения обсуждения (название темы явно выдаст в поиске людям, что ищат информацию по лямбде). И вызов таким образом лямбды не то чего бы я лично хотел бы увидить в коде, который я читаю у себя в проекте (((( .
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
21.12.2015, 17:33
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И вызов таким образом лямбды не то чего бы я лично хотел бы увидить в коде
Немного погоди и скоро появится секта лямбдистов, они будут приходить в форум и троллить людей. Буде все гораздо хуже из-за обширного числа мест, куда можно впихнуть лямбды.

А тех кто похожим образом пишут (планируют такое в своих программах писать) - сами себе злобные буратино.
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
21.12.2015, 17:38
daslex, Я о том же) Я, например, только через время заметил, что ТС заметил функцию лямбдой просто "потому что". И меня почему-то насторожило, что увидить "()" будет крайне тяжело, потом понял, что лямбда тут вообще не надо. И если бы не daslex, не понял, что ТС просто учит тему "лямбда" и решил пихать её повсюду. Предлагаю итерацию цикла вынести в лямбду и в цикли вызывать лямбду. Вот будет весело)
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
21.12.2015, 18:43
Я сомневаюсь, что ТС решил пихать ее повсюду. Это всего-лишь получение личного навыка, который помогает лучше понять некоторые моменты. Я тоже подобным образом экспериментирую, это помогает.

Предлагаю итерацию цикла вынести в лямбду и в цикли вызывать лямбду. Вот будет весело)
Лично я этого не очень понял, да и не очень хочется, есть один человек, который это люто тут использует. Ему весело - другим нет.

Меня лично насторожило не то стремление ТСа в изучении лямбд, а то, что ТС слишком сильно даже без них, осложняет и самому себе жизнь и косвенно осложняет некоторым другим. Я о "тяжести кода", даже если такой его код без лямбд, он очень тяжелый для глаз. Если бы ТС упрощал себе жизнь, то тогда подобные коды читаются вполне неплохо, легче видеть свои же ошибки.

Такие коды напоминают ту кашу, от который уже давно убежали, когда все пишут в main, вместо того, чтобы разделять задачи.

Почему проще? (Я не буду разбивать на файлы), простой пример
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
#include <string>
#include <iostream>
 
using namespace std;
 
class Children
{
public:
    void set_name(string s)
    {
        name = s;
    }
    string get_name() const
    {
        return name;
    }
private:
    string name;
};
 
 
int main()
{
    const int N= 3;
    Children child[N];
    int count=0;
 
    auto it = [&child,&count]()
    {
        string name;
        cout << "input name: ";
        getline(cin,name);
        child[count++].set_name(name);
    };
 
    while (count<N) it();
    while (count--) cout << child[count].get_name() << '\n';
}
Разумеется, здесь лямбда - излишество.
Но тем не менее, несмотря на наличие лямбды, код не стал тяжелым для глаз.
Заодно можно рассмотреть некоторый момент lambda-capture с захватом по ссылке и по значению. (для массива объектов child)
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
21.12.2015, 19:05
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Croessmah, мне кажится или запись ТСа не требует лямбды
нет, не кажется, она тут по сути не нужна.
0
21.12.2015, 19:12

Не по теме:

Цитата Сообщение от daslex Посмотреть сообщение
Немного погоди и скоро появится секта лямбдистов
пришло время написать лямбду!
лямбда сама себя не напишет.
я пишу лямбды каждый день.
я живу полноценной жизнью...

0
21.12.2015, 19:15

Не по теме:

hoggy, настало время пожертвовать лямбде девственный разум

0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.12.2015, 19:22
Лямбда бывает полезна когда нужно инициализировать константный объект путем вызова нескольких модифицирующих функций. Например:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
 
int main() {
 
    const std::string s = [](int i){ 
        std::string is;
        switch(i) {
            case 0: is = "zero"; break;
            case 1: is = "one"; break;
            default: is = "wtf"; break; 
        };
        if( i<10 ) is += "<10";
        else is += ">=10";
        return is;
    }(42);
        
    std::cout << s << '\n';
}
Без лямбды пришлось бы или отказываться от const или создавать именованную функцию.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
21.12.2015, 19:29
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну сделал лямбду, а "запускать" её кто будет?
Гордон Фримен.

Добавлено через 5 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
Без лямбды пришлось бы или отказываться от const или создавать именованную функцию.
Что и нужно делать.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.12.2015, 19:35
Цитата Сообщение от Tulosba Посмотреть сообщение
Без лямбды пришлось бы или отказываться от const или создавать именованную функцию.
в данной ситуации вы уже утратили профит от const
(в плане оптимизаций).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
 
int main() {
 
    const auto i = 42;
    
    const auto s 
        = std::string(i == 0 ? "zero" : i==1 ?  "one" : "wtf") 
        + std::string(i <10 ? "<10" : ">=10");
        
    std::cout << s << '\n';
}
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
21.12.2015, 19:42
Цитата Сообщение от ct0r Посмотреть сообщение
Что и нужно делать.
Именованная функция не нужна и только засорит пространство, если "инициализирующие" действия требуются только здесь и сейчас.
Собственно лямбды вообще не нужны, если всегда и везде делать именованную функцию.
Цитата Сообщение от hoggy Посмотреть сообщение
в данной ситуации вы уже утратили профит от const
Это был всего лишь пример, реальная логика может быть существенно запутаннее, тогда парой тернарок не обойдешься.
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
21.12.2015, 19:54
Цитата Сообщение от Tulosba Посмотреть сообщение
Именованная функция не нужна и только засорит пространство, если "инициализирующие" действия требуются только здесь и сейчас.
Ничего не засорит. Для этого существуют нэймспейсы и генератор имен в мозгу. Сделай нэймспейсу и функции нормальное имя - читабельность повысится по сравнению с лямбдой, которая впихивает нетривиальные детали реализации инициализации в функцию, в которой мне они нафиг не сдались. Функции нужны не только для того, чтоб не дублировать код, но и для того, чтобы улучшать читабельность внятными именами и разделять уровни абстракции.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
21.12.2015, 19:56
Цитата Сообщение от Tulosba Посмотреть сообщение
реальная логика может быть существенно запутаннее, тогда парой тернарок не обойдешься.
если для более сложного случая тернарка получится чрезмерно громоздкой,
то и лямбда для такого случая так же окажется чрезмерно громоздкой.

в таком случае стоит рассмотреть вариант именнованной функции.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
21.12.2015, 20:13
У меня есть вопрос по лямбдам.
Возвращаемый тип из лямбд, это что?

Почему спрашиваю
до лямбды
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class X{
    public:
    int x,y;
} obj;
 
X foo(){
    X obj;
    obj = {1,2};
    return obj;
 
}
 
int main()
{
    obj = foo();
}

с лямбдой
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class X{
    public:
    int x,y;
} obj;
 
 
int main()
{
   obj = []()->X{
        class X{
            public:
            int x, y;
        } value;
 
        value = {1,2};
 
        return value;
    }();
}

Полагал, что сработает.
1
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
21.12.2015, 20:17
Локальный класс зачем?

Добавлено через 1 минуту
C++
1
2
3
4
5
        class X{
            public:
            int x, y;
            operator ::X() const{ return ::X{x,y} ; } ; //Теперь знаем как преобразовать этот X в тот, что "глобальный"
        } value;
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
21.12.2015, 20:17
Помогаю со студенческими работами здесь

Как использовать .sort() для сортировки массива объектов по определенному свойству?
Как использовать .sort() для сортировки массива объектов по определенному общему свойству?

Сортировка массива из объектов по 2-м полям класса
Допустим есть класс Car с полями speed (int) и model (string) и расширяющий Icomparable&lt;Car&gt;. Как пишет об этом Троелсен, необходимо...

Simulink. Какой блок можно использовать для выборки n значений входного и выходного сигнала?
Есть такая схема: Надо во время работы этой схемы выбирать n значений I(t_1)... I(t_n) и Z(t_1)... Z(t_n) (значения входного и...

Массив объектов класса, отладка, доступ к полям элемента массива
Доброго времени! Создал класс с полем char и int. Person.h #ifndef PERSON_H #define PERSON_H //#include &lt;iostream&gt; ...

Когда целесообразно использовать winapi?
Суть сабжа такова, имеет ли смысл использовать winapi для реализации задач связанных с работой с файлами, реестром и т.д? Или же лучше...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru