#c
#c
Вопрос:
Я знаком только с базовым C . Итак, не совсем уверен, что если мне задана функция, скажем f(a, b)
, и мне нужно создать оболочку кэша поверх нее, как я это сделаю? Оболочка кэша вернет результаты из кэша, если они существуют, в противном случае поместите их туда как новую запись.
В Javascript я знаю, что мы можем сделать что-то в этом роде::
function cached(f) {
const cache = new Map();
return function(...args) {
const cacheKey = args.join(',');
if (!cache.has(cacheKey)) {
const value = f(...args);
cache.set(cacheKey, value);
}
return cache.get(cacheKey);
}
}
Итак, несколько вещей, которые мне нужно выяснить…
- Как я могу передать функцию другой функции в C или эмулировать что-то подобное.
- Оператор Spread
...args
расширяет аргументы, чтобы они были доступны как записи на основе индекса. Не знаю эквивалента C того же. join
операция формирует строку непосредственно из массива args —const cacheKey = args.join(',');
Я просто помещаю здесь взаимно однозначное сопоставление. Я уверен, что в C может не быть прямых эквивалентов. Пожалуйста, предложите лучший способ создания оболочки кэша для кэширования результатов функции!
Комментарии:
1. Подсказка:
std::map
.2. Вы можете попробовать поискать в Google «C memoization» и «C dynamic programming». Я не проверял, но я ожидаю хороших результатов.
3. Ребята, я знаю о map
unordered_map
илиmap
в C . Я что-то упускаю из виду в части сложности? функцияf
— это внешний API, код которого я не могу изменить. Поэтому я должен создать оболочку, а не просто использовать map и запоминать ее. Сложность есть.
Ответ №1:
Как я могу передать функцию другой функции в C или эмулировать что-то подобное.
Существует несколько вариантов, включая передачу указателей на функции, объектов функций и т. Д.
Оператор Spread
...args
расширяет аргументы, чтобы они были доступны как записи на основе индекса. Не знаю эквивалента C того же.
Переменные аргументы, пересылка и т. Д. Также Доступны в C с аналогичным синтаксисом.
join
операция формирует строку непосредственно из массива args —const cacheKey = args.join(',');
В стандарте нет функции для этого, но ее довольно легко придумать. Существует также заголовок algorithms, который предоставляет вам общую версию этого, а также новые диапазоны C 20 для другого подхода к нему.
Комментарии:
1. Не могли бы вы, пожалуйста, расширить свой ответ примерами по этим пунктам?
2. @kushalvm рассмотрим
std::function
как простое решение для передачи функции.3. @kushalvm Я боюсь, что это слишком широко для StackOverflow и будет повторять то, о чем говорят многие книги, статьи и даже другие вопросы. Пожалуйста, найдите термины, чтобы узнать больше.
4. Ммм … интересно, как запись кэшированной функции может быть широкой?
5. @kushalvm Вы просили » примеры по этим пунктам «. Это то, что является широким. Эти ответы дают вам названия многих понятий, которые вам нужно будет изучить, чтобы написать функцию-оболочку. StackOverflow не является сервисом для написания кода.