// ^
{
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; }
);
}
: