• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Dziwna deklaracja metod w strukturze oraz pętla foreach.

VPS Starter Arubacloud
0 głosów
276 wizyt
pytanie zadane 15 lutego 2016 w C i C++ przez Exus Początkujący (420 p.)

Witam.

Chcąc nauczyć się używania pętli for_each natknąłem się na ciekawy kod który niezbyt rozumiem z powodu braku doświadczenia i małej wiedzy na temat C++. :/

Mianowicie chodzi o ten kod:

#include <vector>
#include <algorithm>
#include <iostream>
 
struct Sum
{
    Sum(): sum{0} { }
    void operator()(int n) { sum += n; }
    int sum;
};
 
int main()
{
    std::vector<int> nums{3, 4, 2, 8, 15, 267};
 
    std::cout << "before:";
    for (auto const &n : nums)
    {
        std::cout << ' ' << n;
    }
    std::cout << '\n';
 
    std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });
 
    // calls Sum::operator() for each number
    Sum s = std::for_each(nums.begin(), nums.end(), Sum());
 
    std::cout << "after: ";
    for (auto const &n : nums)
    {
        std::cout << ' ' << n;
    }
    std::cout << '\n';
    std::cout << "sum: " << s.sum << '\n';
}

Szczególnie mam problem ze zrozumieniem struktury Sum a dokładniej jej metod, szczególnie z deklaracją jej konstruktora. O co chodzi tym " : " ? :D

Tak samo średnio rozumiem tą linię:

   std::for_each(nums.begin(), nums.end(), [](int &n){ n++; });

Wiem że trzecim argumentem for_each() powinna być funkcja wykonywana z argumentem każdego elementu tablicy no ale tutaj jest coś na rodzaj funkcji zwracającej tablicę? Nie wiem.

Jeżeli znajdzie się ktoś kto rozumie o co w tym chodzi to prosiłbym o jakieś fajne wytłumaczenie. Lubię wiedzieć jak wszystko działa "od podszewki" no ale nie mogę wymagać tak dogłębnych lekcji programowania na forum. :D

Chętnie przygarnę jakieś linki do kursów/poradnik gdzie mogę się dowiedzieć co oznaczają tego typu deklaracje a w szczególności ta:

Sum(): sum{0} { }
    void operator()(int n) { sum += n; }

Z góry dziękuję za pomoc. :)

Jeszcze podaję link do źródła kodu:

http://en.cppreference.com/w/cpp/algorithm/for_each

 

 

3 odpowiedzi

+1 głos
odpowiedź 15 lutego 2016 przez draghan VIP (106,230 p.)
wybrane 15 lutego 2016 przez Exus
 
Najlepsza
Zarzucę Ci hasłami i krótkim wyjaśnieniem z intencją poszukania przez Ciebie właściwych dla siebie materiałów na ten temat. ;)

Ten dwukropek w konstruktorze oznacza listę inicjalizacyjną - w sumie to podstawy wiedzy, dotyczącej konstruktorów. Dzięki niej możesz zainicjalizować, np. stałe obiektu czy obiekt bazowy, ale też wszystkie inne składowe obiektu, jeszcze zanim punkt wykonania wejdzie w ciało konstruktora.

A wyrażenie z [](){} to tzw. wyrażenie lambda - konstrukcja dodana w C++11 - tak w skrócie - funkcja definiowana w miejscu użycia.

EDIT: no, z poszukiwaniem materiałów wyręczył Cię Patrycjerz... :/
+1 głos
odpowiedź 15 lutego 2016 przez Patrycjerz Mędrzec (192,320 p.)
+1 głos
odpowiedź 15 lutego 2016 przez Exus Początkujący (420 p.)
Dzięki za szybką odpowiedź. :) Temat uważam za wyczerpany a teraz czas poszukać jakichś dodatkowych przykładów. :D @draghan dzięki twojemu krótkiemu opisów coś się przypomina z tym dwukropkiem no ale tak to jest jak się przeczyta a potem nie używa. :D

Podobne pytania

+1 głos
1 odpowiedź 632 wizyt
pytanie zadane 1 grudnia 2021 w PHP przez BarSki13 Obywatel (1,250 p.)
0 głosów
2 odpowiedzi 208 wizyt
pytanie zadane 23 marca 2018 w PHP przez gambi Początkujący (350 p.)
0 głosów
0 odpowiedzi 281 wizyt
pytanie zadane 4 lutego 2018 w PHP przez mi-20 Stary wyjadacz (13,190 p.)

92,782 zapytań

141,712 odpowiedzi

320,600 komentarzy

62,114 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...