C++ stl for_each() и функтор, где он создает новые объекты

Я новичок в функторе. Может ли кто-нибудь объяснить мне в следующих кодах, когда программа создает объекты для класса AddValue для каждого элемента вектора? Для меня функция for_each() должна сначала получить элемент из vec, а затем создать новый объект AddVal, используя это значение (obj.i=value), а затем вызвать функтор AddVal(20), чтобы добавить 20 к i. и распечатать его. Но я не видел, где происходит процесс создания новых объектов. Спасибо.

#include<iostream>
#include<vector>
#include<algorithm>
class AddVal{
        public:
        int i;
        AddVal(int x) : i(x) {}
        void operator () (int val) {std::cout << val+i << std::endl;}
};

int main()
{
        std::vector<int> vec = {1,2,3,4,5};
        for_each(vec.begin(),vec.end(),AddVal(20));
}

person daydayup    schedule 11.07.2015    source источник
comment
Звучит как домашнее задание :( Откуда взялся код и что вы сами сделали, чтобы его понять?   -  person Martin James    schedule 12.07.2015


Ответы (2)


AddVal(20) создает один объект AddVal, передаваемый в качестве третьего аргумента for_each. Затем for_each оценивает этот объект для каждого элемента вектора. Код несколько эквивалентен:

std::vector<int> vec = {1,2,3,4,5};
AddVal add_val(20);  // create the AddVal object
for (const int& i : vec) {
  add_val(i);  // calls AddVal::operator()
}
person Alec    schedule 11.07.2015
comment
Я не совсем понимаю. Почему AddVal(20) создает объект AddVal перед циклом for_each? Потому что конструктору нужен параметр для инициализации значения члена i объекта. Вы имеете в виду, что он сначала создает объект без его инициализации? Я никогда не видел создания объекта без инициализации, если конструктор принимает параметры. - person daydayup; 12.07.2015
comment
@daydayup: Как вы думаете, что такое 20, если не параметр конструктора? - person Benjamin Lindley; 12.07.2015
comment
@БенджаминЛиндли. О, я вдруг понял это. Я думал, что он должен сначала принять элемент вектора, а затем добавить к нему 20; теперь он добавляет вектор к 20; это то же самое. - person daydayup; 12.07.2015

for_each(vec.begin(),vec.end(),AddVal(20));
//                                ^
//                           right here

AddVal(20) создает временный объект AddVal, вызывая конструктор AddVal(int x) и передавая 20 в качестве аргумента этому конструктору. Алгоритм for_each затем использует operator() из этого объекта (или его копию) для каждого элемента vec.

person Benjamin Lindley    schedule 11.07.2015