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

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

21.12.2015, 11:30. Показов 1423. Ответов 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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через 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-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru