Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
anti-k
227 / 75 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
#1

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

21.12.2015, 11:30. Просмотров 580. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2015, 11:30
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Можно ли и целесообразно ли использовать лямбду для присвоения значений полям массива объектов? (C++):

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

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

Можно ли использовать memcpy для увеличения размера динамического массива? - C++
char *x = &quot;asdsadasdasdasdasdasdasdasdasd&quot;; char *t = new char; memcpy(t, x, 12); t = '\0'; printf(&quot;%s&quot;, t);Компилятор не...

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

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

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

28
rikimaru2013
C++ Game Dev
2468 / 1137 / 240
Регистрация: 30.11.2013
Сообщений: 3,700
21.12.2015, 11:32 #2
минимальный рабочий пример проблемы тяжело скинуть настолько?)
0
anti-k
227 / 75 / 23
Регистрация: 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
Пришел
Эксперт CЭксперт С++
13759 / 7839 / 893
Регистрация: 27.09.2012
Сообщений: 19,236
Записей в блоге: 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 / 23
Регистрация: 17.07.2015
Сообщений: 774
Завершенные тесты: 1
21.12.2015, 11:39  [ТС] #5
Croessmah,
0
rikimaru2013
C++ Game Dev
2468 / 1137 / 240
Регистрация: 30.11.2013
Сообщений: 3,700
21.12.2015, 17:04 #6
Croessmah, мне кажится или запись ТСа не требует лямбды, а если бы и требовала - то одиночный вызов не предпологает создание лябды - то есть вызов лямбы в такой форме - уже как-то неправильно.

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

А тех кто похожим образом пишут (планируют такое в своих программах писать) - сами себе злобные буратино.
1
rikimaru2013
C++ Game Dev
2468 / 1137 / 240
Регистрация: 30.11.2013
Сообщений: 3,700
21.12.2015, 17:38 #8
daslex, Я о том же) Я, например, только через время заметил, что ТС заметил функцию лямбдой просто "потому что". И меня почему-то насторожило, что увидить "()" будет крайне тяжело, потом понял, что лямбда тут вообще не надо. И если бы не daslex, не понял, что ТС просто учит тему "лямбда" и решил пихать её повсюду. Предлагаю итерацию цикла вынести в лямбду и в цикли вызывать лямбду. Вот будет весело)
0
daslex
1288 / 532 / 110
Регистрация: 02.08.2011
Сообщений: 2,754
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
Пришел
Эксперт CЭксперт С++
13759 / 7839 / 893
Регистрация: 27.09.2012
Сообщений: 19,236
Записей в блоге: 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
:)
Эксперт С++
4619 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
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
Игогошка!
1782 / 684 / 42
Регистрация: 19.08.2012
Сообщений: 1,313
Завершенные тесты: 1
21.12.2015, 19:29 #14
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну сделал лямбду, а "запускать" её кто будет?
Гордон Фримен.

Добавлено через 5 минут
Цитата Сообщение от Tulosba Посмотреть сообщение
Без лямбды пришлось бы или отказываться от const или создавать именованную функцию.
Что и нужно делать.
0
hoggy
6798 / 2984 / 514
Регистрация: 15.11.2014
Сообщений: 6,750
Завершенные тесты: 1
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
21.12.2015, 19:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.12.2015, 19:35
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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