.


:




:

































 

 

 

 


Double operator() ( doublex, doubley ) const




// ^

{

return 3.0 * x / (y + 2.0); // <-

}

};

 

std::transform(

vX.begin(), vX.end(), vY.begin(),

std::back_inserter(vR),

Labmda_1()

);

 

, - ++ - , . - , .

 

- . . , - - - , .

 

- - :

 

template < typename InputIt >

void printCollection (InputIt _first, InputIt _last, const char * _prefix)

{

std::cout << _prefix;

std::for_each(_first, _last,
[] (typename InputIt::value_type x)
{
std::cout << x << ' ';
}
);

std::cout << std::endl;

}

 

, , . -:

 

std::sort(

employees.begin(), employees.end(),

[] (const Employee * _pEmployee1, const Employee * _pEmployee2) -> bool

{

if (_pEmployee1->getName() < _pEmployee2->getName())

return true;

 

else if (_pEmployee1->getName() == _pEmployee2->getName())

return _pEmployee1->getAge() < _pEmployee2->getAge();

 

Else

return false;

}

);

 

, . , - . STL, - .

 

, - , . , - .

 

Std::function

 

:

● ;

● ;

● .

 

, - , , . , , enum-:

 

enum class EmployeeSortMode

{

Alphabetical,

Salaries,

Age

};

 

, , . switch :

 

void sortEmployees (

std::vector< Employee * > & _employees,

EmployeeSortMode _sortMode

)

{

//

switch (_sortMode)

{

//

case EmployeeSortMode::Alphabetical:

std::sort(

_employees.begin(), _employees.end(),

[] (const Employee * _pEmployee1,
const Employee * _pEmployee2)

{

return _pEmployee1->getName() < _pEmployee2->getName();

}

);

break;

 

//

case EmployeeSortMode::Age:

std::sort(

_employees.begin(), _employees.end(),

[] (const Employee * _pEmployee1,
const Employee * _pEmployee2)

{

return _pEmployee1->getAge() > _pEmployee2->getAge();

}

);

break;

 

//

case EmployeeSortMode::Salaries:

std::sort(

_employees.begin(), _employees.end(),

[] (const Employee * _pEmployee1,
const Employee * _pEmployee2)

{

return _pEmployee1->getSalary() > _pEmployee2->getSalary();

}

);

break;

 

//

default:

throw std::logic_error("Unexpected sort mode");

}

}

 

sort. , -, . , .

 

- -? - , , , -, . - . , - . - - , 3 -.

 

std::function, . ( , , ):

 

std::function< bool (const Employee *, const Employee *) > comparator;

^ ^

-------- -----

 

std::function :

 

● :

 

bool MyEmployeeCompareFunction (const Employee *, const Employee *);

comparator = & myEmployeeCompareFunction;

 

● :


struct MyEmployeeCompareFunctor

{

bool operator () (const Employee *, const Employee *) const;

};

 

comparator = & MyEmployeeCompareFunctor();

 

● -:

 

comparator = [] (const Employee *, const Employee *) { }

 

std::function . std::function . :

 

bool result = comparator(employees[ 0 ], employees[ 1 ]);

 

, . - :

 

std::function< bool (const Employee *, const Employee *) >

getEmployeeSortingPredicate (EmployeeSortMode _sortMode)

{

//

switch (_sortMode)

{

//

case EmployeeSortMode::Alphabetical:

return [] (const Employee * _pEmployee1, const Employee * _pEmployee2)

{

return _pEmployee1->getName() < _pEmployee2->getName();

};

 

//

case EmployeeSortMode::Age:

return [] (const Employee * _pEmployee1, const Employee * _pEmployee2)

{

return _pEmployee1->getAge() > _pEmployee2->getAge();

};

 

//

case EmployeeSortMode::Salaries:

return [] (const Employee * _pEmployee1, const Employee * _pEmployee2)

{

return _pEmployee1->getSalary() > _pEmployee2->getSalary();

};

 

//

default:

throw std::logic_error("Unexpected sort mode");

}

}

 

:

 

void sortEmployees (std::vector< Employee * > & _employees,
EmployeeSortMode _sortMode)

{

std::sort(

_employees.begin(),

_employees.end(),

getEmployeeSortingPredicate(_sortMode) //

);

}

 

:

 

int main ()

{

//

std::vector< Employee * > employees;

employees.push_back(new Employee("Ivanov", 25, 1000.0));

employees.push_back(new Employee("Ivanov", 45, 2000.0));

employees.push_back(new Employee("Petrov", 50, 750.0));

employees.push_back(new Employee("Sidorov", 34, 1200.0));

 

//

std::cout << "===== By Age ===== " << std::endl;

sortEmployees(employees, EmployeeSortMode::Age);

printEmployees(employees);

 

//

std::cout << "===== By Salary ===== " << std::endl;

sortEmployees(employees, EmployeeSortMode::Salaries);

printEmployees(employees);

 

//

std::cout << "===== By Name ===== " << std::endl;

sortEmployees(employees, EmployeeSortMode::Alphabetical);

printEmployees(employees);

 

//

std::for_each(
employees.begin(), employees.end(),
[] (Employee * pE) { delete pE; }
);

}

 

:

 

 





:


: 2017-01-21; !; : 371 |


:

:

,
==> ...

1704 - | 1574 -


© 2015-2024 lektsii.org - -

: 0.033 .