Это слишком медленно, потому что вы делаете много копий для ваших дочерних переменных.
измените Child::isSmallerThan
, чтобы взять Child & по ссылке, а не по значению.а также поменяй ребенка на тмп.Поместите это в цикл и измените также ссылку.
Также, как вы предложили, вы можете оптимизировать функцию сравнения.Сделайте 3 лямбда по одному для каждого последнего случая, которые возвращают int -1, 0, 1 для меньшего, равного или большего:
auto get_comparator(char c) {
if (c == 'a')
return +[] (Child& x, Child& y) { /* compare x.avg and y.avg */ }
if (c == 'd')
return +[] (Child& x, Child& y) { ... }
if (c == 'm')
return +[] (Child& x, Child& y) { ... }
}
внутри вашей InsertionSort, вы можете создать свою функцию сравнения:
auto comp_first = get_comparator(ordering_chart[0]);
auto comp_second = get_comparator(ordering_chart[1]);
auto comp_second = get_comparator(ordering_chart[2]);
auto comparator = [comp_first, comp_second, comp_second](Child& x, Child& y) {
int rez = comp_first(x, y);
if (rez != 0) return rez == 1;
rez = comp_second(x, y);
if (rez != 0) return rez == 1;
rez = comp_third(x, y);
return rez == 1;
}
и используйте это, чтобы сравнить Детей