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

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

21.12.2015, 11:30. Просмотров 620. Ответов 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);
        }
    
    };

http://www.cyberforum.ru/cpp-beginners/thread1791881.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2015, 11:30
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Можно ли и целесообразно ли использовать лямбду для присвоения значений полям массива объектов? (C++):

Можно ли использовать итератор для обычного массива?
Можно ли использовать итератор для обычного массива? Если да, то как его...

Можно ли использовать memcpy для увеличения размера динамического массива?
char *x = &quot;asdsadasdasdasdasdasdasdasdasd&quot;; char *t = new char; memcpy(t,...

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

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

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

28
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
21.12.2015, 11:32 #2
минимальный рабочий пример проблемы тяжело скинуть настолько?)
0
anti-k
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
21.12.2015, 11:36  [ТС] #3
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
++Ͻ
14149 / 8074 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 1
21.12.2015, 11:37 #4
Ну сделал лямбду, а "запускать" её кто будет?
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
Завершенные тесты: 1
21.12.2015, 11:39  [ТС] #5
Croessmah,
0
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
21.12.2015, 17:04 #6
Croessmah, мне кажится или запись ТСа не требует лямбды, а если бы и требовала - то одиночный вызов не предпологает создание лябды - то есть вызов лямбы в такой форме - уже как-то неправильно.

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

А тех кто похожим образом пишут (планируют такое в своих программах писать) - сами себе злобные буратино.
1
rikimaru2013
C++ Game Dev
2471 / 1140 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
21.12.2015, 17:38 #8
daslex, Я о том же) Я, например, только через время заметил, что ТС заметил функцию лямбдой просто "потому что". И меня почему-то насторожило, что увидить "()" будет крайне тяжело, потом понял, что лямбда тут вообще не надо. И если бы не daslex, не понял, что ТС просто учит тему "лямбда" и решил пихать её повсюду. Предлагаю итерацию цикла вынести в лямбду и в цикли вызывать лямбду. Вот будет весело)
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
21.12.2015, 18:43 #9
Я сомневаюсь, что ТС решил пихать ее повсюду. Это всего-лишь получение личного навыка, который помогает лучше понять некоторые моменты. Я тоже подобным образом экспериментирую, это помогает.

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

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

Такие коды напоминают ту кашу, от который уже давно убежали, когда все пишут в 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
++Ͻ
14149 / 8074 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 1
21.12.2015, 19:05 #10
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Croessmah, мне кажится или запись ТСа не требует лямбды
нет, не кажется, она тут по сути не нужна.
0
hoggy
21.12.2015, 19:12
  #11

Не по теме:

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

0
Croessmah
21.12.2015, 19:15
  #12

Не по теме:

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

0
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
21.12.2015, 19:22 #13
Лямбда бывает полезна когда нужно инициализировать константный объект путем вызова нескольких модифицирующих функций. Например:
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
Игогошка!
1784 / 686 / 43
Регистрация: 19.08.2012
Сообщений: 1,323
Завершенные тесты: 1
21.12.2015, 19:29 #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну сделал лямбду, а "запускать" её кто будет?
Гордон Фримен.

Добавлено через 5 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
Без лямбды пришлось бы или отказываться от const или создавать именованную функцию.
Что и нужно делать.
0
hoggy
Заблокирован
21.12.2015, 19:35 #15
Цитата Сообщение от 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
Tulosba
:)
Эксперт С++
4746 / 3240 / 496
Регистрация: 19.02.2013
Сообщений: 9,046
21.12.2015, 19:42 #16
Цитата Сообщение от ct0r Посмотреть сообщение
Что и нужно делать.
Именованная функция не нужна и только засорит пространство, если "инициализирующие" действия требуются только здесь и сейчас.
Собственно лямбды вообще не нужны, если всегда и везде делать именованную функцию.
Цитата Сообщение от hoggy Посмотреть сообщение
в данной ситуации вы уже утратили профит от const
Это был всего лишь пример, реальная логика может быть существенно запутаннее, тогда парой тернарок не обойдешься.
0
ct0r
Игогошка!
1784 / 686 / 43
Регистрация: 19.08.2012
Сообщений: 1,323
Завершенные тесты: 1
21.12.2015, 19:54 #17
Цитата Сообщение от Tulosba Посмотреть сообщение
Именованная функция не нужна и только засорит пространство, если "инициализирующие" действия требуются только здесь и сейчас.
Ничего не засорит. Для этого существуют нэймспейсы и генератор имен в мозгу. Сделай нэймспейсу и функции нормальное имя - читабельность повысится по сравнению с лямбдой, которая впихивает нетривиальные детали реализации инициализации в функцию, в которой мне они нафиг не сдались. Функции нужны не только для того, чтоб не дублировать код, но и для того, чтобы улучшать читабельность внятными именами и разделять уровни абстракции.
0
hoggy
Заблокирован
21.12.2015, 19:56 #18
Цитата Сообщение от Tulosba Посмотреть сообщение
реальная логика может быть существенно запутаннее, тогда парой тернарок не обойдешься.
если для более сложного случая тернарка получится чрезмерно громоздкой,
то и лямбда для такого случая так же окажется чрезмерно громоздкой.

в таком случае стоит рассмотреть вариант именнованной функции.
0
daslex
1291 / 535 / 177
Регистрация: 02.08.2011
Сообщений: 2,756
21.12.2015, 20:13 #19
У меня есть вопрос по лямбдам.
Возвращаемый тип из лямбд, это что?

Почему спрашиваю
до лямбды
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
++Ͻ
14149 / 8074 / 1512
Регистрация: 27.09.2012
Сообщений: 19,910
Записей в блоге: 3
Завершенные тесты: 1
21.12.2015, 20:17 #20
Локальный класс зачем?

Добавлено через 1 минуту
C++
1
2
3
4
5
        class X{
            public:
            int x, y;
            operator ::X() const{ return ::X{x,y} ; } ; //Теперь знаем как преобразовать этот X в тот, что "глобальный"
        } value;
1
21.12.2015, 20:17
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2015, 20:17
Привет! Вот еще темы с решениями:

Сортировка массива из объектов по 2-м полям класса
Допустим есть класс Car с полями speed (int) и model (string) и расширяющий...

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

Сколько потоков целесообразно использовать?
Сколько потоков(thread) можно прописать, чтобы система более менее нормально...

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru