Без лямбды:
bool isLess(Worker& lh, Worker& rh) { /* ... */ }
class Workers
{
void OvertimeHoursReport()
{
list<Worker> workers_Copy(workers);
workers_Copy.sort(isLess);
// ...
}
};
Лямбды - это удобный способ создания локальных функций, которые в противном случае вам пришлось бы определять явно, обычно на таком расстоянии, на котором они действительно нужны.
На самом деле, это немного короче, лямбды больше похожи на функторы, но могут быть преобразованы в указатель на функцию неявно (или явно) , если они имеют пустой захват.Попытка объяснить их полностью вышла бы за рамки этого ответа, вы должны получить хорошую книгу по C ++.
Одна вещь о вашем конструкторе:
Workers(list<Worker> workers) // creates an intermediate _copy_(!) of parameter
// this->workers is initialized as empty here
{
this->workers = workers; // now you assign by copying again!
}
Вы можете сэкономить копию, есливместо этого вы используете ссылку;Вы можете инициализировать член напрямую (за исключением пустой инициализации), если используете список инициализаторов классов (не путать с std::initializer_list
):
Workers(list<Worker> const& workers) // reference, no copy
: workers(workers) // direct initialization
{ }
Вариант:
Workers(list<Worker> workers) // the copy again!
: workers(std::move(workers)) // now you move your copy into member
{ }
Этот вариант можно использовать для создания копии, но также можно переместить внешний список в:
Workers(someList); // copy!
Workers(std::move(someList)); // uses move constructor
// -> moves someList into temporary, from
// which it is moved again to member
Вы можете полностью избежать промежуточного элемента, но тогда вам понадобятся два конструктора для:
Workers(list<Worker> const& workers); // reference, as before, copies
Workers(list<Worker>&& workers) // rvalue reference!
: workers(std::move(workers)) // move!
{ }
Примечание: std::move
гарантирует, что параметр worker
снова получит значение r (без которого больше не будет).