2015-07-11 3 views
0

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

#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)); 
} 
+0

Это звучит как домашнее задание :(Где код пришел, и то, что вы сделали сами, чтобы понять это –

ответ

1

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() 
} 
+0

я не совсем понимаю, как приходят AddVal (20) создает объект AddVal перед циклом for_each? Поскольку конструктору нужен параметр для инициализации значения элемента i объекта. Вы имеете в виду, что сначала создаете объект без его инициализации? Я никогда не видел создания объекта без инициализации, если конструктор принимает в параметрах. – daydayup

+0

@daydayup: Как вы думаете, 20, если не параметр для конструктора? –

+0

@BenjaminLindley. О, я внезапно осознал это. Я думал, что он должен сначала взять элемент вектора, а затем добавить 20 к нему, теперь он добавляет вектор к 20; это то же самое. – daydayup

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

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