Занятия
Полезные ссылки
Пдф со всеми алгоритмамиКанал умпалумпы
Другая информация
Рекурсивные лямбда-функции
Работающий, но медленный способ (вызов лямбды в несколько раз медленнее, чем вызов обычной функции):
function<res(args)> f = [&](args) {
f(...);
};
f(...);
};
(Например,
function<void(char)> f = [&](char c))Быстрый (скорость как у глобальных функций), но менее красивый и не поддерживаемый ejudge'ом способ:
auto f = [&](auto f, ...) -> return_type {
f(f, ...);
};
f(f, ...);
};
(Например,
auto f = [&](auto f, char c) -> void.
Возвращаемый тип после стрелочки можно опустить, если нет рекурсии)
Откаты no-thinker
vector<pair<int *, int>> actions;
void set(int *x, int v) {
actions.emplace_back(x, *x);
*x = v;
}
void rollback() {
auto [x, v] = actions.back(); actions.pop_back();
x = v;
void set(int *x, int v) {
actions.emplace_back(x, *x);
*x = v;
}
void rollback() {
auto [x, v] = actions.back(); actions.pop_back();
x = v;
Теперь всюду (что надо уметь откатывать) вместо
x = y,
пишем set(&x, y)
даже если это элемент вектора или массива: set(&a[i], y).
Только вектор должен никогда не менять размер. Ну, и всё-таки придётся помучаться, если меняются разные типы
(например, не только int'ы, как в примере).
Преподаватели параллели 7
Сергей Мельников
Король Четвергов
Виктор Романенко
Арсений Кириллов
Повелитель крокодилов
Леонид Данилевич
Привет!